24 データベース常駐接続プーリング
データベース常駐接続プール(DRCP)は、多数のクライアント間で共有されるサーバーの接続プールです。アクティブ接続数がオープン接続数より大幅に少ない場合、接続プールのDRCPを使用する必要があります。DRCPプールからの接続を共有できる接続プールのインスタンスの数が増加すると、DRCPを使用する利点も増加します。DRCPを使用すると、データベース・サーバーのスケーラビリティが向上し、中間層の接続プーリングに関連したリソースの消費の問題が解決されます。
この章の構成は、次のとおりです。
24.1 データベース常駐接続プーリングの概要
中間層の接続プールでは、すべての接続キャッシュは、サーバーに対して最低限の数の接続を維持します。各接続は、サーバーの使用済リソースを示します。常に、すべてのオープン接続が使用されているわけではありません。つまり、これは、サーバーのリソースを無駄に消費する未使用のリソースがあるということです。複数の中間層のシナリオでは、これらの接続は他の中間層と共有されておらず、アイドルの接続があってもキャッシュにそのまま保持されています。ただし、すべての接続が同時にアクティブになるわけではないため、このような中間層の多数の接続プールによってデータベース・サーバーへの非アクティブな接続の数がかなり増加し、多くのデータベース・リソースが消費されています。
たとえば、中間層の接続プールで、最小のプール・サイズが200の場合、接続プールにはサーバーに対して200の接続があり、データベース・サーバーにはこれらの接続に関連付けられた200のサーバー・プロセスがあります。最小サイズ200の接続プールで30の中間層がある場合、このサーバーには、これに対応する実行中サーバー・プロセスが6000 (200 * 30)個あります。通常、サーバー・プロセスは平均5%の接続にしか使用されていません。したがって、常に、6,000個のサーバー・プロセスのうちアクティブな接続は300個のみです。これは、サーバー上で5,700個以上のサーバー・プロセスが使用されていないということです。このような使用されていないプロセスはサーバー上のリソースを無駄に消費しています。
データベース常駐接続プールを実装すると、サーバー側でプールが作成され、複数のクライアント・プール間でこれが共有されます。これによって、サーバー上でサーバー・プロセス数が減少するため、サーバーでのメモリーの消費がかなり抑えられ、データベース・サーバーのスケーラビリティが向上します。
24.2 データベース常駐接続プーリングを使用可能にする方法
この項では、DRCPをサーバー側とクライアント側で使用可能にする方法について説明します。
24.2.1 サーバー側でDRCPを使用可能にする方法
プールを起動し終了するには、データベース管理者(DBA)がSYSDBA
としてログインする必要があります。この項では、次の概念について説明します。
-
デフォルトの接続プールの起動
-
デフォルトの接続プールの構成
-
プールの終了
-
文のキャッシュ・サイズの設定
ノート:
JDBCにはデフォルトのプールがないので、DRCPの機能はクライアントの接続プールでのみ利用できます。クライアント接続プールがなく、自動コミットがfalse
に設定されたデータベースになんらかの変更を加えた場合、接続を閉じる際にその変更はデータベースにコミットされません。
デフォルトの接続プールの起動
Oracle Databaseのデフォルトの接続プールSYS_DEFAULT_CONNECTION_POOL
を起動するには、dbms_connection_pool.start_pool
メソッドをデフォルト設定で実行します。次に例を示します。
sqlplus /nolog connect / as sysdba execute dbms_connection_pool.start_pool();
デフォルトの接続プールの構成
デフォルトの接続プールはデフォルトのパラメータ値を使用して構成されます。DBMS_CONNECTION_POOL
パッケージ内のプロシージャを使用すると、データベース常駐接続プーリングの接続プールを構成できます。
Oracle Database 12cリリース2 (12.2.0.1)では、MAX_TXN_THINK_TIME
パラメータが導入されました。これは、進行中のトランザクションを含むプールされたサーバーの思考タイムアウトを指定するための新規パラメータです。思考タイムアウトは、クライアントがプールからプールされたサーバーを取得した後で非アクティブ状態でいられる最大時間(秒単位)です。
関連項目:
構成パラメータの詳細は、『Oracle Database管理者ガイド』を参照してください
プールの終了
プールを終了するには、dbms_connection_pool.stop_pool
メソッドをデフォルト設定で実行します。次に例を示します。
sqlplus /nolog connect / as sysdba execute dbms_connection_pool.stop_pool();
文のキャッシュ・サイズの設定
DRCPを使用する場合、キャッシュもサーバー側では行われません。したがって、次のように、サーバー側で文のキャッシュ・サイズを指定する必要があります。50が最適サイズです。
execute DBMS_CONNECTION_POOL.CONFIGURE_POOL (session_cached_cursors=>50);
関連トピック
24.2.2 クライアント側でDRCPを使用可能にする方法
クライアント側でDRCPを使用可能にするには、次のステップを実行します。
ノート:
この項の例は、クライアント側の接続プールとしてユニバーサル接続プールを使用します。他の接続プールの場合、次の2つのステップに従い、oracle.jdbc.pool.OracleConnectionPoolDataSource
をコネクション・ファクトリとして使用して、DRCPを使用可能にできます。
-
nullでなく空でないString値を接続プロパティ
oracle.jdbc.DRCPConnectionClass
に渡します -
(
SERVER=POOLED
)をCONNECT_DATA
に長い接続文字列で追加します。
次のように、短いURLで(SERVER=POOLED)
を指定することもできます。
jdbc:oracle:thin:@//<host>:<port>/<service_name>[:POOLED]
次に例を示します。
jdbc:oracle:thin:@//localhost:5221/orcl:POOLED
次の例は、クライアント側でDRCPを使用可能にする方法を示します。
ノート:
UCPでは、接続クラスを指定しない場合、接続プール名がデフォルトで接続クラス名として使用されます。
例24-1 ユニバーサル接続プールを使用してクライアント側でDRCPを使用可能にする方法
String url = "jdbc:oracle:thin:@//localhost:5521/orcl:POOLED"; PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource(); pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); // Set DataSource Property pds.setUser("HR"); pds.setPassword("hr"); System.out.println ("Connecting to " + url); pds.setURL(url); pds.setConnectionPoolName("HR-Pool1"); pds.setMinPoolSize(2); pds.setMaxPoolSize(3); pds.setInitialPoolSize(2); Properties prop = new Properties(); prop.put("oracle.jdbc.DRCPConnectionClass", "HR-Pool1"); pds.setConnectionProperties(prop);
24.3 複数の接続プール間でのプールされたサーバーの共有について
複数の接続プール間でサーバー上にプールされたサーバー・プロセスを共有するには、同じDRCP接続クラス名をすべてのプールされたサーバー・プロセス用にサーバー上に設定します。接続プロパティoracle.jdbc.DRCPConnectionClass
を使用して、DRCP接続クラス名を設定できます。
24.4 DRCPのタグ付け
DRCPを使用すると、サーバーの接続プールに、サーバー・プロセスを特定のタグ名と関連付けるように要求できます。特定の接続にタグを適用し、後でそのタグ付けされた接続を取得できます。接続にタグを付けると、特定のセッションを簡単に取り出せるようになり、セッション・プーリングが強化されます。
Oracle Database 12cリリース2 (12.2.0.1)以降、DRCPでは複数のタグ付けがサポートされています。デフォルトでは、既存のDRCPアプリケーションとの互換性ファクタのために、この機能が無効になっています。この機能をDRCPアプリケーションで有効にするには、oracle.jdbc.UseDRCPMultipletag
接続プロパティをTRUE
に設定します。
複数のタグ付け機能を有効にすると、DRCPタグを設定する際に使用したものと同じAPIを使用して、複数のDRCPタグを使用できます。違いはセパレータを使用する点のみです。DRCPタグのキーと値は等号 (=
)で区切り、複数のタグはセミコロン(;
)で区切ります。
DRCPタグの使用時には次の点に注意してください。
-
タグのキーおよび値はNULLまたは空にすることはできません。
-
複数のタグを指定する場合、左端のタグの優先度が最も高く、右端のタグの優先度が最も低くなります。
-
タグ付けされた接続を取得する際に、完全一致が見つからない(すべてのタグが一致しない)場合、部分一致を検索します。
ノート:
Oracle Database 12cリリース2 (12.2.0.1)以降、同じデータベース・ユーザーに属するがプロキシ・ユーザーが異なるDRCPセッションは、プロキシ・ユーザー間で共有できます。
関連項目:
セッション・プーリングと接続のタグ付けの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。
24.5 セッション状態の修正のためのPL/SQLコールバック
Oracle Database 12cリリース2 (12.2.0.1)以降、セッション状態のPL/SQLベースの修正コールバックをサーバーで提供できるようになりました。このアプリケーションで提供されたコールバックは、プールからチェックアウトされたセッションをアプリケーションで要求された必要な状態に変換します。このコールバックは、データベース常駐接続プーリング(DRCP)があってもなくても動作します。
ノート:
PL/SQLベースの修正コールバックは、複数のタグ付けの場合にのみ適用できます。
このコールバックを使用すると、修正ロジックがサーバー上のセッション状態に対して実行されるため、アプリケーションのパフォーマンスを改善できます。したがって、修正ロジックのために、この機能によりデータベースへのアプリケーションのラウンドトリップがなくなります。関連するパッケージで実行権限を付与されている適切なインストール・ユーザーは、アプリケーションのインストール時に修正コールバックを登録する必要があります。
例24-2 PL/SQLの修正コールバックの例
次に、セッション・プロパティSCHEMA
およびCURRENCY
を修正するためのPL/SQL修正コールバックの実装例を示します。
CREATE OR REPLACE PACKAGE mycb_pack AS
PROCEDURE mycallback (
desired_props IN VARCHAR2,
actual_props IN VARCHAR2
);
END;
/
CREATE OR REPLACE PACKAGE BODY mycb_pack AS
PROCEDURE mycallback (
desired_props IN VARCHAR2,
actual_props IN VARCHAR2
) IS
property VARCHAR2(64);
key VARCHAR2(64);
value VARCHAR2(64);
pos number;
pos2 number;
pos3 number;
idx1 number;
BEGIN
idx1:=1;
pos:=1;
pos2:=1;
pos3:=1;
property := 'tmp';
-- To check if desired properties are part of actual properties
while (pos > 0 and length(desired_props)>pos)
loop
pos := instr (desired_props, ';', 1, idx1);
if (pos=0)
then
property := substr (desired_props, pos2);
else
property := substr (desired_props, pos2, pos-pos2);
end if ;
pos2 := pos+1;
pos3 := instr (property, '=', 1, 1);
key := substr (property, 1, pos3-1);
value := substr (property, pos3+1);
if (key = 'CURRENCY') then
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CURRENCY=''' || value || '''';
elsif (key = 'SCHEMA') then
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA=' || value;
end if;
idx1 := idx1+1;
end loop;
END; -- mycallback
END mycb_pack;
/