本文為“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻譯加閱讀筆記。覺得是重點的就用粗體表示了。
白皮書版本為March 2025, Version 3.3,副標題為:Optimizing Oracle Database resource usage for applications and mid-tier services。
簡介
數據庫駐留連接池 (DRCP) 是 Oracle 數據庫的一項功能,專為需要多個連接并優化數據庫資源利用率的環境而開發。DRCP 通常適用于微服務和 Web 應用程序場景,在這些場景中,應用程序獲取數據庫連接,在相對較短的時間內進行操作,然后釋放連接。DRCP 為數據庫提供了一個“專用”服務器進程池(稱為池化服務器),可由運行在同一臺或多臺應用層主機上的多個應用程序共享。這些池化服務器處理與客戶端應用程序的數據庫連接/會話。連接代理進程在數據庫實例級別控制池化服務器。由于 DRCP 是在應用程序運行時選擇的可配置功能,因此客戶端應用程序可以同時使用傳統連接架構和基于 DRCP 的連接架構。
在 Oracle 數據庫傳統的專用連接模型中,每個進程在打開和關閉連接時都會創建和銷毀數據庫服務器。具有空閑專用連接的應用程序將占用數據庫資源,例如服務器進程、內存存儲等。
DRCP 實現會在數據庫主機上創建一個服務器進程池,供多個應用程序共享。由于客戶端連接在數量減少的數據庫服務器進程上進行多路復用,DRCP 池顯著降低了服務器上的內存消耗。這消除了數據庫服務器創建和銷毀的開銷,并提高了涉及 Oracle 數據庫的應用程序部署的可擴展性。如本文檔后面所述,DRCP 中具有空閑連接的應用程序不會消耗數據庫資源。
DRCP 提升了數據庫和應用層的可擴展性,因為與數據庫的連接以最低的成本保持。數據庫內存僅由池服務器使用。
從 Oracle Database 11g 版本開始,所有版本均支持 DRCP,并且可在本地和 Oracle 云中使用。任何運行 JDBC、ODP.NET 和 Oracle 調用接口 (OCI) 庫的應用程序都可以使用 DRCP 連接到 Oracle Database。使用 Oracle Database Python、Node.js、PHP、Ruby 和 Go 驅動程序的應用程序也支持 DRCP。
本文檔涵蓋了 DRCP 的架構、配置設置、命令、優勢、系統視圖和示例,幫助您入門和運行 DRCP。
有關 DRCP 的更詳細概述,請參閱最新的 Oracle Database 管理員指南:DRCP 部分。
DRCP架構概述
DRCP 使應用程序能夠擴展到數萬個并發數據庫連接。DRCP 架構在實現這種可擴展性方面發揮著至關重要的作用。
DRCP 使用池化服務器進程,這些進程本質上是專用服務器進程和數據庫會話的組合。此模型避免了為每個僅短暫需要服務器的客戶端連接分配專用服務器的開銷。
從 DRCP 請求連接的客戶端應用程序(在本節中稱為客戶端)與稱為連接代理的 Oracle 后臺進程進行通信。連接代理會在來自客戶端的入站連接請求之間多路復用池化服務器進程。
最初,連接代理使用一組預留的 DRCP 進程(稱為身份驗證服務器)來驗證來自客戶端的連接請求。通常,當前池中的服務器數量中約有 5% 會保留用于身份驗證。
圖 1:客戶端和數據庫主機之間的 DRCP 架構
每當客戶端進程獲取應用程序連接時,連接代理都會從空閑池中選擇一個池化服務器進程并將其傳遞給客戶端。客戶端將直接連接到該服務器進程(稱為“活動的”池化服務器),直到數據庫活動完成。
服務器完成數據庫活動后,客戶端應用程序必須將活動的池化服務器進程釋放回 DRCP 池。然后,這將重新建立與連接代理的鏈接。與連接代理的鏈接將保持打開狀態,直到客戶端進程停止運行或客戶端獲取應用程序連接為止。
此外,對于 DRCP,會話內存存儲在數據庫的程序全局區域 (PGA) 中,該區域在物理上對進程(此處指數據庫連接)是私有的。這種實現使客戶端能夠在需要任何數據庫活動時快速重新建立連接。
DRCP Quickstart
可以通過運行 PL/SQL DRCP 包 DBMS_CONNECTION_POOL 中的相應過程來啟動、配置和停止池。只有擁有 SYSDBA 權限的用戶(即 SYS 用戶)或由 SYS 用戶授予 PL/SQL DRCP 包 EXECUTE 訪問權限的用戶才能運行該池。
在 Oracle 云自治數據庫中,DRCP 默認啟動。否則,請以具有所需權限的用戶身份登錄 Oracle 數據庫,并運行 dbms_connection_pool.start_pool() PL/SQL 過程。
該過程成功運行后,任何客戶端應用程序都可以使用 Easy Connect 字符串語法,在網絡連接描述符字符串中使用“:pooled”字符串或設置 (SERVER=POOLED) 通過 DRCP 訪問 Oracle 數據庫。未更改連接字符串的應用程序將繼續使用傳統的專用服務器進程。
有關配置 DRCP 以及使用 DRCP 的其他應用程序的更多詳細信息和示例,請參閱本技術簡介的后續章節。
How DRCP works
使用 DRCP 時,數據庫監聽器首先將來自客戶端的新連接請求交給 DRCP 連接代理 (CB)。這些連接請求必須先進行身份驗證,然后才能在連接上運行任何數據庫事務。
代理使用池中預留的身份驗證服務器之一執行身份驗證。登錄觸發器在每次身份驗證和每個用戶會話(創建用戶會話時)觸發一次。注銷觸發器在每次注銷和會話釋放時觸發。身份驗證完成后,代理會保持客戶端連接持久,直到客戶端關閉連接。此外,池服務器請求和釋放可以在這個持久且經過身份驗證的連接上進行。這些活動由代理協調。
收到應用程序連接請求時,連接代理會從數據庫服務器進程的空閑池中為客戶端分配一個服務器,并將經過身份驗證的客戶端連接移交給該服務器。客戶端的所有數據庫交互都由這個分配的服務器進程(稱為“繁忙”服務器)進行。當客戶端通過 API 調用顯式關閉會話或客戶端應用程序結束時,繁忙服務器將連同會話一起釋放回空閑服務器池。然后,如果客戶端應用程序仍在運行,客戶端將恢復與連接代理的連接。連接代理將保留此連接,直到收到后續客戶端連接請求、客戶端應用程序終止連接或客戶端應用程序結束為止。
圖 2:DRCP 操作階段
池大小以及連接代理和身份驗證服務器的數量均可配置。啟用 DRCP 時,每個數據庫實例始終至少有一個連接代理。
Database Concept中的這張圖也可以參考:
When to use DRCP
DRCP 通常推薦用于以下情況:
- 包含無法使用應用程序連接池的應用服務器(例如 PHP)的架構
- 包含多個 Web 服務器、微服務或需要數據庫訪問和應用程序連接池的應用服務器的大規模 Web 部署
- 需要以最低的數據庫主機內存使用率支持高客戶端連接流量的 Web 架構
- 連接保持時間較短的應用程序
- 主要對所有連接使用相同數據庫憑據的應用程序
- 具有相同連接或會話設置(例如日期格式和 PL/SQL 包狀態)的應用程序
這些用例通常涉及在多臺主機上運行的多進程應用程序,這些應用程序與數據庫保持大量持久連接,但不希望在連接不活躍時消耗數據庫服務器內存。借助 DRCP,數據庫可以擴展到數萬個并發連接。
(這個例子很直觀)例如,一個池大小為 200 的中間層連接池將擁有 200 個與數據庫的連接。反過來,數據庫將有 200 個與這些連接關聯的服務器進程。假設有 30 個類似的中間層應用程序。那么數據庫將有 200 * 30 = 6000 個相應的服務器進程以專用服務器模式運行。假設在任何給定時間,這些連接(以及服務器進程)中只有 5% 處于使用狀態。在這種情況下,只有 300 個服務器進程處于活動狀態,而數據庫端在任何給定時間運行的 5,700 個空閑服務器進程則被浪費或用作未使用的資源。
DRCP 可以通過將客戶端連接復用到更少的池化服務器上??來解決此資源浪費問題。例如,6000 個客戶端連接可能只需要 100 個池化服務器進程(取決于連接保持的時間),從而實現最佳的數據庫資源利用率和更高的可擴展性。
當通過 TCP/IP 連接并使用基于用戶 ID/密碼的數據庫身份驗證時,可以使用 DRCP。使用 Oracle 的 Bequeath 或 TCPS 連接時,則無法使用 DRCP。(注意這個限制)
建議將 DRCP 與應用程序連接池結合使用,以實現最高效率和最佳的數據庫資源消耗。為了獲得最佳 DRCP 性能,應用程序應明確指定連接類別,如本文檔后面所示。
此外,使用 DRCP 時,請考慮這些限制。
將 DRCP 與其他數據庫服務器進程模型進行比較
除了 DRCP 的池化服務器之外,Oracle 應用程序還可以使用另外兩種數據庫服務器進程模型來訪問數據:專用服務器和共享服務器。Oracle 數據庫默認提供專用服務器。
下表列出了專用服務器、共享服務器和池化服務器之間的區別。
專用服務器 | 共享服務器 | 池化服務器 |
---|---|---|
建立連接后,會創建與專用服務器進程的網絡連接以及相關會話。 | 連接創建后,會建立與調度程序進程的網絡連接。會話會在 SGA 中創建。 | 連接創建后,會建立與代理的網絡連接并進行身份驗證。 |
專用服務器處理連接上的活動 | 連接上的每個操作(本質上是一個SQLNet往返,可能涉及一個或多個SQL或PL/SQL語句的執行、事務提交等。)都會經過調度程序,調度程序會將工作交給共享服務器。 | 當應用程序請求會話時,代理服務器會被喚醒,并將網絡連接交給一個已建立會話的池化服務器。然后,池化服務器會像專用服務器一樣直接處理后續的數據庫請求或活動。 |
正在執行但客戶端連接空閑的程序將保持與服務器進程的連接并占用會話資源。 | 正在執行但客戶端連接空閑的程序將占用會話資源,但不保持與服務器進程的連接。 | 正在執行但客戶端連接空閑且已釋放數據庫會話的程序將保持與連接代理的連接。 |
關閉客戶端連接會導致會話被釋放,服務器進程終止。 | 關閉客戶端連接會導致會話被釋放,客戶端將與調度程序斷開連接。 | 關閉客戶端連接會導致包含該會話的池化服務器被釋放到池中。與連接代理的網絡連接將保留。 |
內存使用量與服務器進程和會話的數量成正比。每個連接對應一個服務器和一個會話。 | 內存使用量與共享服務器和會話的總和成正比。每個客戶端連接對應一個會話。 | 內存使用量與池化服務器進程及其會話的數量成正比。每個池化服務器對應一個會話。 |
表 1 – 專用服務器、共享服務器和池服務器之間的區別
注意:對于 DRCP,連接空閑時將被釋放回應用程序連接池。
專用服務器、共享服務器和池化服務器之間的主機內存使用情況示例
專用服務器 | 共享服務器 | 池化服務器 | |
---|---|---|---|
數據庫服務器內存 | 5000 x 8 MB | 100 x 8 MB | 100 x 8 MB |
會話內存 | 5000 x 400 KB | 5000 x 400 KB(注意:對于共享服務器,會話內存是從 SGA 分配的) | 100 x 400 KB |
DRCP 連接代理開銷 | 0(不適用) | 0(不適用) | 5000 x 35 KB |
總內存 | 42 GB | 2.8 GB | 1 GB |
表 2 – 專用服務器、共享服務器和池化服務器的數據庫內存使用情況示例
可以看出,在三個選項中,DRCP 池服務器提供了最佳的數據庫主機內存使用率。
配置數據庫駐留連接池
本節介紹如何在服務器端和客戶端配置和啟用 DRCP:
- 在服務器端啟用和配置 DRCP
- 部署 DRCP 的應用程序
注意:Oracle 云自治數據庫中已默認啟動 DRCP。
您可以使用 DRCP 配置選項和 DRCP 數據庫初始化參數來配置 DRCP 的設置,本節稍后將詳細介紹。
在服務器端啟用和配置 DRCP
從 Oracle Database 21c 開始,數據庫管理員 (DBA) 在配置 DRCP 時首先要選擇是每個 PDB 的 DRCP 還是 CDB 的 DRCP。請注意,CDB DRCP 是默認的 DRCP 配置。
只有擁有 SYSDBA 權限的 DBA 或擁有 DBMS_CONNECTION_POOL 包 EXECUTE 權限(由 SYS 用戶授予)的 PDB 管理員才能啟動和停止池。在本節中,我們將使用 SQL*Plus 在數據庫中配置 DRCP。
對于 CDB DRCP,擁有 SYSDBA 權限的數據庫用戶(通常是 SYS 用戶)可以使用 DBMS_CONNECTION_POOL 包的以下命令來管理 DRCP。
- 啟動連接池:start_pool 過程啟動 DRCP。當 DRCP 啟動時,如果未指定連接池名稱,Oracle 數據庫會將創建的默認連接池命名為 SYS_DEFAULT_CONNECTION_POOL。
connect / as sysdba
execute dbms_connection_pool.start_pool()
從 Oracle Database 23ai 開始,如果您使用多池 DRCP,start_pool 過程還允許您指定池名稱。
connect / as sysdba
execute dbms_connection_pool.start_pool('my_pool')
一旦啟動,池會在實例重新啟動時自動重新啟動,除非使用 stop_pool() 過程明確停止。
- 停止連接池:stop_pool 過程停止 DRCP。
如果默認 DRCP 池 (SYS_DEFAULT_CONNECTION_POOL) 正在運行,則可以通過以下命令將其停止:
execute dbms_connection_pool.stop_pool()
從 Oracle Database 23ai 中,您可以按如下方式停止多池 DRCP 中的特定命名池:
execute dbms_connection_pool.stop_pool('my_pool')
Oracle Database 23ai 還在 stop_pool() 中提供了一個新的可選 DRAINTIME 參數。此參數允許在指定的連接耗盡時間(以秒為單位)后關閉活動的 DRCP 池,或立即關閉(值為 0),而無需等待連接空閑。此功能使 DBA 能夠更好地控制 DRCP 的使用和配置。此參數可與默認 DRCP 池以及多池 DRCP 配置中的命名池一起使用。例如:
-- 此調用將立即中止默認池中的所有池服務器并停止默認池。
execute dbms_connection_pool.stop_pool(pool_name => '', draintime => 0)
-- 此調用將等待 30 秒,然后中止池服務器并停止默認池。
execute dbms_connection_pool.stop_pool(pool_name => '', draintime => 30)
-- 此調用將立即中止名為“my_pool”的池中的所有池服務器并停止該池。
execute dbms_connection_pool.stop_pool(pool_name => 'my_pool', draintime => 0)
-- 此調用將等待 30 秒,然后中止名為“my_pool”的池中的所有池服務器并停止該池。
execute dbms_connection_pool.stop_pool(pool_name => 'my_pool', draintime => 30)
此調用將立即中止默認池中的所有池服務器并停止默認池。
3. 配置連接池:configure_pool 過程會使用附加選項配置默認或命名的 DRCP 池。例如:
execute dbms_connection_pool.configure_pool(
minsize => 4,
maxsize => 40,
incrsize => 2,
session_cached_cursors => 20,
inactivity_timeout => 300,
max_think_time => 600,
max_use_session => 500000,
max_lifetime_session => 86400)
當必須修改所有連接池參數時,使用此過程。
要配置名為 my_pool 的池,請運行:
execute dbms_connection_pool.configure_pool(
pool_name => 'my_pool',
minsize => 4,
maxsize => 40,
incrsize => 2,
session_cached_cursors => 20,
inactivity_timeout => 300,
max_think_time => 600,
max_use_session => 500000,
max_lifetime_session => 86400)
- 改變參數:或者,方法 dbms_connection_pool.alter_param() 可用于設置 DRCP 池中的單個參數,并且不會影響其他池參數。
要更改默認池(SYS_DEFAULT_CONNECTION_POOL)中的“MAX_THINK_TIME”參數值,請運行:
execute dbms_connection_pool.alter_param(
param_name => 'MAX_THINK_TIME',
param_value => '1200')
要更改命名池(例如 my_pool)中的“MAX_THINK_TIME”參數值,請運行:
execute dbms_connection_pool.alter_param(
pool_name => 'my_pool',
param_name => 'MAX_THINK_TIME',
param_value => '1200')
alter_param 和 configure_pool 選項之間的區別在于 alter_param 僅影響單個參數,而 configure_pool 要求在調用時指定所有參數值。
- 恢復默認值:restore_defaults() 過程重置任何 DRCP 池的默認配置值。
-- 要恢復默認池(SYS_DEFAULT_CONNECTION_POOL)的默認值,請運行
exec dbms_connection_pool.restore_defaults()
-- 要恢復指定池(例如 my_pool)的默認配置,請運行
exec dbms_connection_pool.restore_defaults(‘my_pool`)
如果 DRCP 處于 PDB 級別(每個 PDB DRCP),則 PDB 管理員(啟用權限)將必須對相應的 PDB 執行上述命令。
DRCP 配置設置
下表顯示了 configure_pool 和 alter_param 過程可以使用的 DRCP 配置選項列表:
DRCP 選項 | 描述 |
---|---|
POOL_NAME | 要配置的池的名稱。在 Oracle Database 21c 之前,唯一支持的名稱是默認值 SYS_DEFAULT_CONNECTION_POOL。從 Oracle Database 23ai 開始,其他名稱可用于新的多池功能。 |
MINSIZE | 設置池中池化服務器的最小數量。當在 CDB 級別配置 DRCP 時,默認值為 4;當啟用每個 PDB 的 DRCP 時,默認值為 0。 |
MAXSIZE | 設置池中允許的最大池化服務器數量。如果達到此限制并且所有池化服務器都處于繁忙狀態,則連接請求將等到服務器空閑為止。默認值為 40。 |
INCRSIZE | 設置在服務器不可用于連接且池尚未達到其最大大小時池化服務器增加的增量數。默認值為 2。 |
SESSION_CACHED_CURSORS | 為所有池連接啟用數據庫參數 SESSION_CACHED_CURSORS。通常,此數字設置為常用語句的工作集的大小。緩??存使用服務器上的游標資源。默認值為 20。init.ora 參數也可用于設置整個數據庫實例的值。池選項允許基于 DRCP 的應用程序覆蓋實例設置。 |
INACTIVITY_TIMEOUT | 池中空閑服務器的生存時間(以秒為單位)。超過此時間后,空閑服務器進程將被終止。當池未達到其最大容量時,此參數有助于縮小池。如果池大小已為最小值,則此參數將不適用。默認值為 300 秒。 |
MAX_THINK_TIME | 客戶端連接到池中服務器后允許的最長不活動時間(以秒為單位)。如果應用程序代碼或腳本在此時間內未發出數據庫調用,則池化服務器可能會返回到池中以供重用,并且客戶端連接將被終止。如果應用程序稍后嘗試使用該連接,則會收到 ORA-3113 或 ORA-3135 錯誤。默認值為 120 秒。 |
MAX_TXN_THINK_TIME | 客戶端使用池化服務器啟動事務后,其最長不活動時間(以秒為單位)。如果客戶端應用程序在從池中獲取池化服務器后未在 max_txn_think_time 規定的時間內發出數據庫調用,則池化服務器將被釋放,客戶端連接將被終止。此參數的默認值為 max_think_time 參數值。應用程序可以將此參數值設置為高于 max_think_time 值,以便為打開事務的連接提供更多時間。如果應用程序稍后嘗試使用該連接,則會收到 ORA-3113 或 ORA-3135 錯誤。 |
MAX_USE_SESSION | 服務器在被標記為重新啟動之前,可以被提取并釋放到池中的最大次數。默認值為 500000。 |
MAX_LIFETIME_SESSION | 池化服務器在重新啟動前的生存時間(以秒為單位)。默認值為 86400 秒。 |
NUM_CBROK | 為處理連接請求而創建的連接代理數量。此參數可使用 alter_param() 進行設置。默認值為 1。如果每個 PDB 都啟用了 DRCP,則無法使用 alter_param() 來設置此參數。只有根 DBA 可以使用數據庫初始化參數 CONNECTION_BROKERS 進行設置,如下圖所示。PDB 管理員也無法修改此參數的值。對于 CDB 根級 DRCP,如果未使用 CONNECTION_BROKERS 設置此參數,則根 DBA 可以使用 alter_param() 過程進行設置。建議使用 CONNECTION_BROKERS 來設置此參數。 |
MAXCONN_CBROK | 設置每個連接代理可以處理的最大連接數。操作系統的每個進程文件描述符限制必須設置得足夠高,以支持指定的連接數。此參數只能使用 alter_param() 設置。默認值為 40000。如果啟用了每個 PDB DRCP,則不能使用 alter_param() 設置此參數。只有根 DBA 可以使用數據庫初始化參數 CONNECTION_BROKERS 來設置它們,如下圖所示。PDB 管理員也無法修改此參數的值。對于 CDB DRCP,如果未使用 CONNECTION_BROKERS 設置此參數,則根 DBA 可以使用 alter_param() 過程來設置它。建議使用 CONNECTION_BROKERS 來設置此參數。 |
表 3 – DRCP 配置選項
您還可以設置數據庫初始化參數,以便在 DRCP 中進行額外的配置和優化:
DRCP 參數 | 描述 |
---|---|
ENABLE_PER_PDB_DRCP | 從 Oracle Database 21c 及更高版本開始可用。此參數指定 DRCP 是在 CDB 級別配置還是在每個 PDB 級別配置。默認值為 FALSE,表示在 CDB 級別配置 DRCP。當此參數設置為 TRUE 時,將為每個 PDB 創建一個隔離的連接池,并且不會在 CDB 級別創建任何連接池。 |
DRCP_DEDICATED_OPT | 從 Oracle Database 19.11 及更高版本開始可用。此參數配置 DRCP 專用優化的使用。在 Oracle Database 19c 中默認值為 YES,從 Oracle Database 21c 及更高版本開始默認值為 NO。將此參數設置為 YES 即可啟用專用優化。當與 DRCP 代理的連接數小于 DRCP 池的最大大小時,專用優化使 DRCP 像專用服務器一樣運行。即使連接處于非活動狀態,專用優化也允許開放的池服務器數量增長到最大大小。根據 ENABLE_PER_PDB_DRCP 參數的值,CDB 根用戶或 PDB 管理員用戶可以修改此參數。 |
DRCP_CONNECTION_LIMIT | 從 Oracle Database 21c 及以上版本開始可用。此參數設置 PDB 的 DRCP 連接數限制。如果 PDB 設置了會話限制并隨后重新啟動,則默認值為 10 * 會話。否則,為 0(無限制 DRCP 連接)。 |
MAX_AUTH_SERVERS | 從 Oracle Database 19.10 及以上版本開始可用。此參數指定 DRCP 身份驗證池中服務器進程的最大數量。此值必須大于或等于 MIN_AUTH_SERVERS 參數值。如果 MIN_AUTH_SERVERS 值為 0,則此值必須至少為 1。默認值為 25。根據 ENABLE_PER_PDB_DRCP 參數的值,此參數可由 CDB 根用戶或 PDB 管理員用戶修改。 |
MIN_AUTH_SERVERS | 從 Oracle Database 19.10 及以上版本開始可用。此參數指定 DRCP 身份驗證池中的最小服務器進程數。此值必須小于或等于 MAX_AUTH_SERVERS 和 PROCESSES 參數的值。根據 ENABLE_PER_PDB_DRCP 參數的值,此參數可以由 CDB root 用戶或 PDB admin 用戶修改。 |
CONNECTION_BROKERS | 此參數指定連接代理類型、每種類型的連接代理數量以及每個代理的最大連接數。啟用每個 PDB 的 DRCP 后,PDB 管理員用戶無法在 PDB 中設置此參數。 |
表 4 – DRCP 數據庫初始化參數
ALTER SYSTEM SQL 命令可用于修改除 ENABLE_PER_PDB_DRCP 之外的所有上述參數。此參數只能通過數據庫配置文件設置。
為每個 PDB 的 DRCP 配置 Broker
由于 Broker 進程在所有 PDB 之間共享,因此 DBA_CPOOL_INFO 中的池參數 num_cbrok 和 maxconn_cbrok 將被忽略,并且 PDB 管理員無法使用 dbms_connection_pool.alter_param() 進行修改。這些參數可以使用數據庫初始化參數 CONNECTION_BROKERS 進行設置,并且只能在 ROOT 容器中動態更改。默認情況下,將啟動單個 Broker 進程,每個 Broker 的最大連接數限制為 40000 個,并在所有 PDB 之間共享。
根 DBA 可以使用 ALTER SYSTEM SQL 命令設置 CONNECTION_BROKERS 參數,如下所示:
ALTER SYSTEM SET CONNECTION_BROKERS = '((TYPE=POOLED)(BROKERS=2)(CONNECTIONS=40000))'
BROKERS 選項將設置連接代理的數量,而 CONNECTIONS 選項將設置每個代理的最大連接數。
將 DRCP 與 Oracle Real Application Clusters (RAC) 結合使用
當 DRCP 與 Oracle RAC (真正應用集群 - 一種數據庫選項,其中單個數據庫由多個節點上的多個實例托管)結合使用時,每個數據庫實例都有自己的連接代理和服務器池。Oracle RAC 環境中的 DRCP 配置應用于每個數據庫實例。因此,每個池的配置相同。例如,所有池都將以最小服務器進程數啟動。單個 dbms_connection_pool 命令將同時更改每個實例的池。但是,表 6 中的數據庫初始化參數(ENABLE_PER_PDB_DRCP 和 CONNECTION_BROKER 參數除外)可以在不同的實例中設置為不同的值。
將 DRCP 與 Oracle Cloud 自治數據庫 (ADB) 結合使用
默認情況下,Oracle 云自治數據庫 (ADB) 會啟用 DRCP。請注意,客戶端應用程序可以選擇使用 DRCP,具體方法如下節所述。Oracle ADB 不允許用戶啟動或停止 DRCP。
在客戶端應用程序中使用 DRCP
一旦在數據庫上啟用了 DRCP,應用程序就可以通過在 Easy Connect 字符串中指定“:POOLED”(如下例所示)或在網絡連接描述符字符串中指定(SERVER=POOLED)來使用 DRCP 連接到數據庫。
Easy Connect 字符串中帶有“:pooled”的 DRCP
oraclehost.company.com:1521/booksdb.company.com:pooled
在網絡連接描述符字符串中使用 SERVER=POOLED 啟用 DRCP
BOOKSDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oraclehost.company.com) (PORT=1521))(CONNECT_DATA = (SERVICE_NAME=booksdb.company.com)(SERVER=POOLED)))
通過 DRCP 連接到 Oracle 數據庫的應用程序應該使用連接進行短暫的數據庫活動,然后在數據庫活動完成后立即關閉它們。
管理 DRCP 連接
DRCP 保證最初由一個數據庫用戶使用的池化服務器中的會話只能由具有相同用戶標識符的連接重用。DRCP 還將池進一步劃分為邏輯組或“連接類”。池化服務器也根據服務名稱進行劃分。建議應用程序提供連接類,以便在通過 DRCP 連接數據庫時獲得最佳性能。
DRCP 還允許應用程序設置會話純度屬性,以控制池化會話的可重用性。
連接類和會話純度設置可幫助多個應用程序、Web 應用和微服務充分利用 DRCP 的潛力,并為最終用戶提供最佳性能。
什么是連接類別?
連接類定義了應用程序想要使用并在多個應用程序進程或其他應用程序之間共享的連接類型的邏輯名稱。正確的連接類集合可以有效地劃分連接,并避免連接之間不必要的會話共享。
**默認情況下,DRCP 連接不會在數據庫用戶和服務名稱之間共享。**連接類增加了一層額外的共享邊界,當應用程序使用相同的用戶名和服務名稱時,這些邊界可以維持。需要會話中不同狀態的應用程序應該使用不同的用戶名和/或連接類。
如果沒有空閑的池化服務器與指定連接類中用戶 ID 的請求匹配,并且池已達到其最大大小,則將使用池中具有不同類的空閑服務器,并為其創建新的會話。如果沒有可用的池化服務器,連接請求將等待一個可用的服務器。此行為允許數據庫繼續運行而不會過載。
例如,對于同一個用戶名“Blake”,Sales 組中的應用程序可能愿意在彼此之間共享池化服務器,但不愿意與 CRM 組共享。在下圖中,組名“Sales”和“CRM”也是為連接類設置的值。
圖 3:跨應用程序共享 DRCP 池
什么是會話純度?
會話純度 (Session Purity) 屬性指定應用程序是需要“全新”會話 (NEW),還是將應用程序邏輯設置為重用“池化”會話 (SELF)。此屬性控制 DRCP 中池化會話的可重用性。重用池化會話將提高連接性能。
DRCP 會話純度和連接類別的默認值
DRCP 連接的連接類別和純度屬性將根據應用程序是否使用本地連接池具有默認值。
DRCP 連接設置 | 來自應用程序連接池的連接的默認值 | 非來自應用程序連接池的連接的默認值 |
---|---|---|
純度 | SELF | NEW |
連接類 | 對于使用 Oracle 調用接口 (OCI) 庫的應用程序,每個應用程序會話池隨機生成的唯一名稱將用作會話池中所有連接的默認連接類。Python-oracledb Thin 模式默認生成一個帶有前綴“DPY”的唯一連接類名。Node-oracledb Thin 模式默認生成一個帶有前綴“NJS”的唯一連接類名。對于 JDBC Thin,如果設置了 UCP,則默認值為指定的連接池名稱。如果未設置 UCP,則該類將獲取一個隨機名稱。在托管和核心 ODP.NET 中,默認值為 null。 | “SHARED” |
表 5 – 會話純度和連接類別默認值
連接字符串中的會話純度和連接類別
許多數據庫驅動程序都允許應用程序將連接類別和連接純度值設置為屬性。但是,當無法通過應用程序代碼設置這些屬性值,或者這些值并非最佳時,您可以在連接字符串中設置參數 POOL_CONNECTION_CLASS 和 POOL_PURITY。如果服務器不是 POOLED 類型的,則這兩個參數將被忽略。
連接字符串中指定的 POOL_CONNECTION_CLASS 和 POOL_PURITY 屬性將具有最高優先級,并覆蓋默認值或應用程序指定的值(通過 Oracle 調用接口 (C/C++) 中的 OCI OCIAttrSet 或 OCISessionGet 調用設置,或通過 Python、JDBC 和 ODP.NET 瘦驅動程序設置)。
POOL_PURITY 的有效值為 SELF 和 NEW。這些值不區分大小寫。
注意:在連接字符串中使用 SELF 時,即使應用程序在 OCISessionRelease() 中通過了 OCI_SESSRLS_DROPSESS 模式,任何具有應用程序屬性 NEW 純度的會話請求都不會從應用程序池中刪除。
POOL_CONNECTION_CLASS 的值可以是任何符合連接類語義的字符串。該值區分大小寫。
-- Easy Connect 字符串示例:
oraclehost:1521/db_svc1:pooled?pool_purity=self&pool_connection_class=ccname
在 Easy Connect 語法中,pool_connection_class 和 pool_purity 屬性可在 Oracle Database 21c 及更高版本中使用。如果應用程序使用 Oracle Client 庫,則這些屬性在 Oracle Client 12 或更高版本的 Easy Connect 語法中受支持。
有關這些 DRCP 參數用法的更多信息,請查看最新的 Easy Connect 語法技術簡介。
-- 網絡連接描述符字符串示例:
ServerPool = (DESCRIPTION =
(ADDRESS=(PROTOCOL=tcp)(HOST=oraclehost)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=db_svc1)(SERVER=POOLED))
(POOL_CONNECTION_CLASS=CCNAME)(POOL_PURITY=SELF))
每個 PDB 的 DRCP
Oracle Database 12c 中引入的多租戶選項引入了容器數據庫 (CDB) 和可插拔數據庫 (PDB) 模型。所有 PDB 只能使用一個 DRCP 池,并且由擁有 SYSDBA 權限的 ROOT 用戶在 CDB 級別進行管理。這被稱為“CDB DRCP”。
從 Oracle Database 21c 開始,DRCP 可以位于 CDB 級別(CDB DRCP)或 PDB 級別(每個 PDB DRCP)。在“每個 PDB DRCP”模式下,PDB 管理員用戶(例如 PDB1ADMIN)可以配置、管理和監控該 PDB 擁有的 DRCP 池。代理仍然歸 ROOT 所有,并由所有每個 PDB 的 DRCP 池共享。
啟用每個 PDB 的 DRCP
默認情況下,DRCP 位于 CDB 級別。在 CDB DRCP 模式下,CDB 中運行的單個 DRCP 池由所有 PDB 共享。在此模式下,數據庫初始化參數 ENABLE_PER_PDB_DRCP 將設置為“FALSE”。
可以將 ENABLE_PER_PDB_DRCP 設置為“TRUE”以啟用每個 PDB 的 DRCP。
為了使 PDB1ADMIN 用戶能夠訪問 DBMS_CONNECTION_POOL 包并查詢 DRCP 統計信息,ROOT 用戶 (SYS) 必須向 PDB1ADMIN 授予以下權限。
GRANT CREATE SESSION, CREATE SYNONYM TO PDB1ADMIN;
GRANT EXECUTE ON DBMS_CONNECTION_POOL TO PDB1ADMIN;
GRANT SELECT ON V_$CPOOL_STATS TO PDB1ADMIN;
GRANT SELECT ON V_$CPOOL_CC_STATS TO PDB1ADMIN;
GRANT SELECT ON V_$CPOOL_CONN_INFO TO PDB1ADMIN;
GRANT SELECT ON V_$CPOOL_CC_INFO TO PDB1ADMIN;
GRANT SELECT ON V_$AUTHPOOL_STATS TO PDB1ADMIN;
為了使 DRCP 池的管理和監控更加容易,PDB 管理員用戶(在本例中為 PDB1ADMIN)可以創建以下同義詞。
CREATE SYNONYM DBMS_CONNECTION_POOL FOR SYS.DBMS_CONNECTION_POOL;
CREATE SYNONYM V$CPOOL_STATS FOR SYS.V_$CPOOL_STATS;
CREATE SYNONYM V$CPOOL_CC_STATS FOR SYS.V_$CPOOL_CC_STATS;
CREATE SYNONYM V$CPOOL_CONN_INFO FOR SYS.V_$CPOOL_CONN_INFO;
CREATE SYNONYM V$CPOOL_CC_INFO FOR SYS.V_$CPOOL_CC_INFO;
CREATE SYNONYM V$AUTHPOOL_STATS FOR SYS.V_$AUTHPOOL_STATS;
完成此操作后,僅允許相應的 PDB 管理員在 PDB 級別進行池管理。
CDB DRCP 與每個 PDB 的 DRCP
在 CDB DRCP 中,DBA ROOT 用戶(例如 SYS)管理 CDB 中的 DRCP 池。所有 PDB 共享此 DRCP 池。
從 CDB 管理池 | 從 PDB 管理池 | 從 CDB 查看池統計信息 | 從 PDB 查看池統計信息 |
---|---|---|---|
ROOT 用戶可以連接到 CDB 時運行 dbms_connection_pool 包的所有過程,例如 start_pool() 和 stop_pool()。如果已通過 init.ora 或 ALTER SYSTEM 設置了數據庫參數 connection_brokers,則 alter_param() 過程無法修改 DRCP 配置參數 num_cbrok 和 maxconn_cbrok。 | 任何用戶都不能從 PDB 管理 CDB DRCP。 | ROOT 用戶可以查詢以下 gv$ 表:gv$cpool_stats gv$cpool_cc_stats gv$cpool_conn_info gv$authpool_stats gv$cpool_cc_info ,它們對應的 v$tables 和 DBA_CPOOL_INFO。 | 連接到 PDB 的 ROOT 用戶只能從 gv$cpool_conn_info 和 gv$authpool_stats 及其對應的 v$ 表查看統計信息。 |
表 6 – CDB DRCP 行為
在每個 PDB DRCP 中,PDB 管理員用戶管理每個單獨的 PDB 的 DRCP 池。
從 CDB 管理池 | 從 PDB 管理池 | 從 CDB 查看池統計信息 | 從 PDB 查看池統計信息 |
---|---|---|---|
當連接到 CDB 時,ROOT 用戶或 PDB 管理員用戶無法運行 dbms_connection_pool 包中的過程。ROOT 用戶可以使用數據庫參數 connection_brokers 更改 num_cbrok 和 maxconn_cbrok 的值。 | 只有 PDB 管理員用戶才能在連接到 PDB 時運行 dbms_connection_pool 包的所有過程,例如 start_pool() 和 stop_pool()。alter_param() 過程無法修改 DRCP 配置參數 num_cbrok 和 maxconn_cbrok。PDB 管理員用戶無法更改數據庫參數 connection_brokers。 | ROOT 用戶可以查詢以下 gv t a b l e s 以及連接到 C D B 的相應 v tables 以及連接到 CDB 的相應 v tables以及連接到CDB的相應v 表。gv$cpool_stats gv$cpool_cc_stats gv$cpool_conn_info gv$authpool_stats gv$cpool_cc_info 結果將包含有關所有 PDB 的 DRCP 信息。 | PDB 管理員用戶或 ROOT 用戶可以查詢 PDB 中的以下 gv$tables:gv$cpool_stats、gv$cpool_cc_stats、gv$cpool_conn_info、gv$authpool_stats、gv$cpool_cc_info ,以及它們對應的 v$tables 和 DBA_CPOOL_INFO。查詢結果將包含特定 PDB 的 DRCP 信息。 |
使用 DRCP 的隱式連接池
Oracle Database 23ai 引入了隱式連接池 (Implicit Connection Pooling)。該功能可與 DRCP 配合使用,使數據庫能夠根據 SQL 或 PL/SQL 事務中的特定邊界要求自動釋放連接/會話,并減少應用程序的池管理責任。隱式連接池可與每個 PDB 的 DRCP 和 CDB 的 DRCP 配合使用。
DRCP 的隱式連接池會檢測數據庫連接/會話何時處于無狀態(無打開的游標、臨時 LOB、臨時表或活動事務),并對數據庫連接執行“隱式釋放”。
“隱式釋放”過程包含兩個步驟:
- 將連接交還給連接代理
- 將池中的服務器連同會話一起返回到 DRCP 的“空閑服務器”池。
“隱式釋放”過程在應用程序不知情的情況下發生。后續對該連接的數據庫調用會從 DRCP 池中隱式獲取一個會話。
使用 DRCP 的隱式連接池適用于以下應用:
- 不執行數據庫工作時持有連接
- 使用自定義連接池或根本不使用連接池
- 負載處理稀疏但重復
- 包含難以遷移到 Oracle 連接池 API 的舊代碼或第三方代碼
請參閱隱式連接池博客,了解更多詳情。
啟用隱式連接池
要使應用程序能夠使用隱式連接池,首先需要在數據庫服務器上配置 DRCP。
在應用程序端,您需要在連接字符串中設置 POOL_BOUNDARY 選項,以使應用程序能夠使用隱式連接池。POOL_BOUNDARY 選項可以有兩個值:
- STATEMENT – 當數據庫會話處于無狀態時,DRCP 執行“隱式釋放”。
- TRANSACTION – 當數據庫會話處于無狀態時,DRCP 執行“隱式釋放”。此釋放操作將在提交/回滾時關閉所有活動游標、臨時表和臨時 LOB。
-- 具有隱式連接池的 Easy Connect 字符串示例:
oraclehost:1521/db_svc_name:pooled?pool_boundary=statement-- 具有隱式連接池的示例網絡連接描述符字符串:
DBServerPool = (DESCRIPTION =
(ADDRESS=(PROTOCOL=tcp)(HOST=oraclehost)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=db_svc_name)(SERVER=POOLED)
(POOL_BOUNDARY=STATEMENT))
對于隱式連接池中的連接,會話純度值默認為“SELF”。隱式連接池無需對應用程序進行任何其他更改。
隱式連接池的優勢
隱式連接池 (DRCP) 增強了數據庫連接的復用能力,無需依賴應用程序顯式打開或關閉連接調用。它允許長時間保持連接的應用程序共享其數據庫服務器進程和會話內存。這減輕了數據庫主機的負載,并提高了整個系統的可擴展性。
總而言之,隱式連接池 (DRCP) 為應用程序帶來以下優勢:
- 通過更佳的多路復用功能提高應用程序的可擴展性
- 減少應用程序端所需的池處理
- 通過優化數據庫資源利用率,支持中間層更高的并發性
多池 DRCP(命名池)
Oracle Database 23ai 引入了多池 DRCP 功能,支持創建具有不同配置的多個命名池。借助此功能,數據庫管理員可以添加或刪除 DRCP 池。多池 DRCP 可以在 CDB 和 PDB 級別配置。應用程序必須在連接字符串中指定池名稱才能訪問特定的 DRCP 池。
多池 DRCP 為數據庫管理員 (DBA) 提供了配置靈活性,并有助于根據傳入的應用程序請求類型組織數據庫連接。
圖 4:多池 DRCP 架構
添加和刪除命名池
新的 PL/SQL 過程 dbms_connection_pool.add_pool() 會添加新的連接池。
要使用默認連接池參數添加名為“my_pool”的新連接池,請運行以下命令:
execute dbms_connection_pool.add_pool('my_pool')
要刪除“my_pool”,請運行:
execute dbms_connection_pool.remove_pool('my_pool')
配置多池 DRCP
除了啟用 DRCP 之外,多池 DRCP 不需要在數據庫服務器上進行其他配置。
應用程序需要在連接字符串中指定 (POOL_NAME=<pool_name>),并在 DRCP 中指定 (SERVER=POOLED),以便將客戶端連接標記到相應的池中。例如:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host_name)(PORT=port_number))
(CONNECT_DATA=(SERVICE_NAME=db_service.company.com>)(SERVER=POOLED)
(POOL_NAME=my_pool)))
如果您使用 Easy Connect String,那么您可以按如下方式指定池名稱:
host_name:port_number/db_service.company.com:pooled?pool_name=my_pool
您可以使用 DBMS_CONNECTION_POOL 包中的 PL/SQL 過程,按照本文檔“在服務器端啟用和配置 DRCP”部分中的說明,配置類似于默認 DRCP 池的命名池。請注意,啟用 DRCP 后,SYS_DEFAULT_CONNECTION_POOL 仍將自動創建,并保留為默認 DRCP 池。
有關配置和使用多池 DRCP 的更多詳細信息,請查看博客“Oracle Database 23ai 中的多池數據庫駐留連接池 (DRCP)”。
監控DRCP
Oracle 數據庫中提供內置數據字典視圖和動態性能視圖,用于監控 DRCP 的性能。數據庫管理員可以查看統計信息,例如繁忙和空閑服務器的數量,以及池中命中和未命中的次數與客戶端請求總數的對比情況。
Oracle 數據庫中可用于查看 DRCP 統計信息的內置視圖包括:
DBA_CPOOL_INFO
V$CPOOL_STATS
V$CPOOL_CC_STATS
V$CPOOL_CONN_INFO
V$CPOOL_CC_INFO
V$AUTHPOOL_STATS
在以下小節中,我們將使用 SQL*Plus 查詢 DRCP 的數據字典視圖。
DBA_CPOOL_INFO
DBA_CPOOL_INFO 視圖顯示有關連接池的配置信息,例如池狀態、最大和最小連接數等。以下示例檢查池是否已啟動(ACTIVE 狀態)并查找允許的最大池服務器數量:
SQL> SELECT connection_pool, status, maxsize FROM dba_cpool_info;
CONNECTION_POOL STATUS MAXSIZE---------------------------- ---------- ----------SYS_DEFAULT_CONNECTION_POOL ACTIVE 40
V$CPOOL_STATS View
V C P O O L S T A T S 視圖顯示數據庫實例的 D R C P 統計信息。 V CPOOL_STATS 視圖顯示數據庫實例的 DRCP 統計信息。V CPOOLS?TATS視圖顯示數據庫實例的DRCP統計信息。VCPOOL_STATS 視圖可以評估連接池設置的效率。
以下示例中的查詢顯示了一個應用程序如何有效地使用連接池。較低的未命中次數表明服務器和會話已被共享應用程序重用,并且純度達到“SELF”。等待計數顯示,略高于 10% 的請求必須等待池服務器可用:
SQL> SELECT num_requests, num_hits, num_misses, num_waits FROM v$cpool_stats;
NUM_REQUESTS NUM_HITS NUM_MISSES NUM_WAITS
------------ ---------- ---------- ----------10031 99990 40 1055
如果設置了連接類別(允許池服務器和會話重用),則 NUM_MISSES 會較低。如果池最大大小值對于連接負載而言太小,則 NUM_WAITS 會較高。
啟用 CDB 級 DRCP 后,此視圖僅在從 CDB 根目錄(SYS 用戶)查詢時返回數據,從 PDB 查詢時返回 0 行。啟用每個 PDB 的 DRCP 后,此視圖在從 CDB 根目錄(SYS 用戶)和 PDB(PDBADMIN 用戶)查詢時均會返回數據。
注意:SQL*Plus 默認不設置 PURITY,因此不會重用 DRCP 會話。
V$CPOOL_CC_STATS View
視圖 V$CPOOL_CC_STATS 包含每個實例的連接池的連接類級別統計信息。例如:
SQL> SELECT cclass_name, num_requests, num_hits, num_misses FROM v$cpool_cc_stats;
CCLASS_NAME NUM_REQUESTS NUM_HITS NUM_MISSES
---------------------------- ------------- -------- -----------
HR.MYCLASS 100031 99993 38
啟用 CDB 級 DRCP 后,此視圖僅在從 CDB 根(SYS 用戶)查詢時返回數據,從 PDB 查詢時返回 0 行。對于每個 PDB 的 DRCP,此視圖在從 CDB(根用戶)和 PDB(PDBADMIN 用戶)查詢時均會返回數據。
在 Oracle Database 23ai 中,V$CPOOL_CC_STATS 視圖中添加了一個新的 POOL_NAME 列,用于維護命名池(如果有)的連接類統計信息。
V$CPOOL_CONN_INFO View
您可以監視視圖 V$CPOOL_CONN_INFO 來識別配置錯誤的計算機,例如未正確設置連接類的計算機。此視圖顯示與連接代理的每個連接的連接信息。以下示例中的查詢將計算機名稱映射到類名稱:
SQL> SELECT cclass_name, machine FROM v$cpool_conn_info;
CCLASS_NAME MACHINE
--------------------------------------- ------------GK.OCI:SP:wshbIFDtb7rgQwMyuYvodA gklinux
在此示例中,您將檢查 Linux 計算機 (gklinux) 上的應用程序,并確保已設置 cclass。更多 V$CPOOL_CONN_INFO 視圖的使用示例可在此處找到。
在 Oracle Database 23ai 中,此視圖添加了一個新的 POOL_NAME 列,用于維護命名池(如果有)的連接池信息。
V$CPOOL_CC_INFO View
V$CPOOL_CC_INFO 保存每個數據庫實例的 DRCP 池的池到連接類映射信息。以下示例中的查詢標識了數據庫實例中的所有連接類:
SQL> SELECT pool_name, cclass_name FROM v$cpool_cc_info;
POOL_NAME CCLASS_NAME CON_ID
---------------------------------------- ------------------------------ ------
SYS_DEFAULT_CONNECTION_POOL HR.MYCLASS 3
在此示例中,用戶是 HR,連接類是 MYCLASS。
V$AUTHPOOL_STATS View
V$AUTHPOOL_STATS 顯示 DRCP 身份驗證服務器的統計信息。此視圖從 Oracle Database 21c 及更高版本開始可用。以下示例中的查詢查看身份驗證服務器統計信息:
SQL> select num_srvs, num_busy, num_free, num_waiters from v$authpool_stats;
NUM_SRVS NUM_BUSY NUM_FREE NUM_WAITERS
---------- ---------- ---------- -----------3 0 3 0
上面的例子顯示有三個認證服務器進程空閑并準備接收任何連接認證請求。
不同語言的 DRCP 示例
要在應用程序中啟用并使用 DRCP,我們必須:
- 在數據庫中配置并啟用 DRCP
- 配置應用程序以使用 DRCP 連接
- 部署應用程序
如果在未配置數據庫 DRCP 的情況下執行以下代碼片段,則連接將無法成功,并且會向應用程序返回錯誤。
使用 Python 的 DRCP
Oracle 數據庫的最新 Python 接口 python-oracledb(包名:oracledb)支持 DRCP。
DRCP 的應用程序部署
要請求數據庫使用 DRCP 池化服務器,您可以在 oracledb.create_pool() 或 oracledb.connect() 中使用類似于以下語法之一的特定連接字符串。
使用 Oracle 的 Easy Connect 語法,連接參數如下所示:
import oracledb
connection = oracledb.connect(user="hr", password=userpwd,
dsn="dbhost.example.com/orcl:pooled”,
cclass="MYAPP")
或者,如果您使用名為 customerdb 的 tnsnames.ora 別名進行連接:
connection = oracledb.connect(user="hr", password=userpwd,
dsn="customerdb")
此時只需要修改Oracle Network配置文件tnsnames.ora:
customerdb = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbhost.example.com)
(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=CUSTOMER)(SERVER=POOLED)))
您還可以在創建獨立連接或 python-oracledb 連接池時通過設置 server_type 參數來指定使用 DRCP 池化服務器。
pool = oracledb.create_pool(user="hr", password=userpwd,
dsn="dbhost.example.com/orclpdb", min=2, max=5, increment=1,
server_type="pooled")
設置連接類別和純度屬性
此用戶選擇的名稱提供了 DRCP 會話內存的分區。因此,重用僅限于類似的應用程序。如果啟動了多個應用程序進程,它可提供最大程度的池共享。
要使用連接類名稱(cclass 屬性)創建請求 DRCP 服務器的應用程序連接池并獲取連接,請執行以下操作:
pool = oracledb.create_pool(user="hr", password=userpwd,
dsn="dbhost.example.com/orclpdb:pooled",
min=2, max=5, increment=1,
cclass="MYAPP") connection = pool.acquire()
默認情況下,池中所有連接的純度將設置為 SELF(python-oracledb 中的 PURITY_SELF 值),這也是推薦的最佳實踐。
python-oracledb 連接池大小無需與 DRCP 池大小匹配。DRCP 池大小決定了整體執行并行度的限制。
連接類名也可以傳遞給 acquire() 函數:
connection = pool.acquire(cclass="OTHERAPP")
要將池連接純度更改為 NEW,請使用 acquire() 函數將純度屬性設置為 PURITY_NEW。
connection = pool.acquire(cclass="MYAPP", purity=oracledb.PURITY_NEW)
您可以使用此連接對象來運行任何數據庫事務。
with connection.cursor() as cursor:print("Performing query using DRCP...")for row in cursor.execute("select sysdate from dual"):print(row)
此代碼片段將打印數據庫主機的當前系統日期。
如果未設置 cclass 參數和 SELF 純度,則池化服務器會話將無法得到最佳重用,并且 DRCP 統計視圖可能會記錄較大的 NUM_MISSES 值。
DRCP 允許每次從池中獲取連接時重用或清理連接的會話內存。在創建池或連接時,純度參數值可以是 PURITY_NEW、PURITY_SELF 或 PURITY_DEFAULT。默認情況下,python-oracledb 池化連接使用 PURITY_SELF,獨立連接使用 PURITY_NEW。
在連接字符串中設置連接類別和純度
對于 python-oracledb Thin 模式,您可以在 Oracle 數據庫(從 21c 版本開始)的 Easy Connect 字符串中指定連接類別和純度。這樣,當您想使用 DRCP 時,就無需修改現有應用程序:
dsn = "localhost/orclpdb:pooled?pool_connection_class=MYAPP&pool_purity=self"
使用 Node.js 的 DRCP
略。
使用 JDBC 的 DRCP
略。
使用 Oracle 調用接口 (OCI) 的 DRCP
略。
使用 Oracle 調用 C++ 接口 (OCCI) 的 DRCP
略。
使用 ODP.NET 的 DRCP
略。
使用 PHP 的 DRCP
略。
DRCP 常見問題
問題 1:如何檢查和調整連接代理的數量?
可以使用以下 SQL 語句檢查和調整連接代理的數量:
SQL> select num_cbrok from DBA_CPOOL_INFO;
NUM_CBROK
----------
1
要設置連接代理,請按照表 3 所述設置 NUM_CBROK DRCP 配置選項。
SQL> select num_cbrok from DBA_CPOOL_INFO;
NUM_CBROK
----------
2
對于大量并發連接請求,建議增加連接代理的數量,因為單個連接代理可能會過載(代理的 CPU 使用率高表示)。
問題 2:如果有多個連接代理,有什么方法可以檢查各個連接代理進程之間的連接分配負載?
關于連接分配負載,您可以在 v$cpool_conn_info 中查看,如下所示:
SQL> select cmon_addr, count(*) from v$cpool_conn_info group by cmon_addr;
CMON_ADDR COUNT(*)
---------------- ----------
000000014BE63E40 500
000000014BE64198 500
在上面的示例中,每個連接代理進程建立了 500 個客戶端連接。總共建立了 1000 個與 DRCP 的連接。
問題 3:當應用程序與連接代理有連接時,我可以停止 DRCP 池嗎?
Oracle Database 23ai 在 dbms_connection_pool.stop_pool() 中引入了 DRAINTIME 參數,該參數可配置為立即中止所有池化服務器并停止池。
在此版本之前,當客戶端與代理建立連接時,您無法停止池。
問題 4:我是否應該重新啟動 DRCP 池來更改連接代理的數量?
如果您要增加代理數量,則無需重啟池。如果您要減少代理數量,請等待客戶端/應用程序斷開連接。
連接代理負責管理連接的簽入/簽出,如果代理數量增加,它們會分擔負載,不會增加 CPU 使用率。連接代理進程僅在客戶端連接或主動請求并釋放池化服務器時占用 CPU。
問題 5:連接代理的數量限制是多少?它可以同時處理多少個連接請求?
DRCP 連接代理的數量沒有硬編碼限制,因為它完全取決于工作負載。Oracle 的自動工作負載存儲庫 (AWR) 報告可以深入了解連接代理的負載情況。這可以指示是否需要增加連接代理進程的數量。
問題 6:DRCP 支持 TCPS 連接嗎?
不,截至本文發布時,它尚不支持 TCPS 連接。
問題 7:在 DRCP 中增加 MAX_AUTH_SERVERS 參數后,如何驗證身份驗證服務器 (num_auth) 會話的數量(使用 SQL 查詢跟蹤身份驗證效果的提升)
如果您擁有足夠數量的身份驗證服務器,則應該不會看到任何網絡 (TNS) 錯誤。
如果您想隨時查看有多少個身份驗證服務器,可以以 root DBA 用戶身份在 Oracle Database 19c 中查詢。
SQL> select kmpcpname as pool, kmpcpnsrv as num_srvs, kmpcpbsrv as num_busy, kmpcpfsrv as num_free, (kmpcpawait+kmpcpswait) as num_waiters from x$kmpcp where kmpcpstate != 0;
POOL NUM_SRVS NUM_BUSY NUM_FREE NUM_WAITERS
------------------------------ ---------- ---------- ---------- -----------
SYS_AUTH_POOL 1 0 1 0 SYS_DEFAULT_CONNECTION_POOL 4 1 3 0
從 Oracle Database 21c 開始的未來 DB 版本中,您將擁有相同的 V$AUTHPOOL_STATS 視圖。
問題 8:如何增加 DRCP 中允許的身份驗證服務器進程數量?
身份驗證服務器的數量受數據庫初始化參數 MAX_AUTH_SERVERS 的限制。此參數的默認值為 40。
要增加 DRCP 中的身份驗證服務器進程數量,您需要以具有所需權限的用戶(根 DBA 或 PDB 管理員用戶,視具體情況而定)在數據庫中增加 MAX_AUTH_SERVERS 值,如下所示:
SQL> ALTER SYSTEM SET MAX_AUTH_SERVERS = 100
問題 9:如果連接代理和身份驗證服務器的數量增加,會對基礎架構的哪些方面產生影響?
連接代理和身份驗證服務器數量的增加會影響數據庫主機的 CPU。
結論
DRCP 允許應用程序使用跨多個應用服務器和中間層部署共享的數據庫中的連接池。這些應用程序必須主動將數據庫活動與獲取或釋放會話的調用包裝在一起,才能有效地使用 DRCP。此類應用程序可以快速建立連接,并在大量連接中使用最少的數據庫資源。
Oracle 的數據庫代理解決方案,流量導向模式下的連接管理器 (CMAN-TDM),擁有自己的池化特性——代理駐留連接池 (PRCP),其工作原理與 DRCP 類似。如果應用程序與 DRCP 配合良好,那么它與 PRCP 配合也同樣良好。對于 PRCP,唯一需要(在應用程序端)進行的更改是將 tnsnames.ora 別名或 Easy Connect 字符串指向 PRCP 服務器,而不是數據庫/DRCP 服務器。
總而言之,DRCP 的優勢如下:
- DRCP 允許在多個客戶端應用程序和應用服務器之間共享資源
- DRCP 通過減少數據庫主機上的資源使用量來提高數據庫和應用程序的可擴展性
更多信息
更多信息,請參閱以下鏈接和文檔:
- 了解 DRCP,Oracle 數據庫管理員指南
- 使用數據庫駐留連接池,Oracle 數據庫開發人員指南
- 數據庫駐留連接池,Oracle 數據庫概念
- 數據庫駐留連接池,Oracle 調用接口程序員指南
- 數據庫駐留連接池,Oracle .NET 數據提供程序開發人員指南
- 數據庫駐留連接池,Oracle JDBC 開發人員指南
- 新的 DRCP 參數,Oracle 新特性指南
- CMAN-TDM – 適用于可擴展和高可用性應用程序的 Oracle 數據庫連接代理,CMAN-TDM 技術簡介
- Oracle Database Easy Connect Plus,Easy Connect 和 Easy Connect Plus 技術簡介
- 使用池化和緩存進行應用程序編程,Oracle 數據庫資源池化和緩存技術簡介
- GOL 使用 Oracle 云基礎設施在 60 秒內跟蹤購票情況,Oracle 客戶案例
- 多池 DRCP 博客,Oracle Database 23ai 中的多池數據庫駐留連接池 (DRCP)
- 隱式連接博客,當連接導致數據庫過載時使用隱式連接池