4 接続作成コンシューマ

Oracle Databaseリリース23ai以降、接続作成のたびにUCPコールバックをコール元アプリケーションに設定できます。

4.1 接続作成コンシューマの実装

Oracle Databaseの現在のリリースでは、特定のPoolDataSourceオブジェクトに対して新しい接続作成コンシューマを登録できます。これは、成功したか失敗したかに関係なく、データベース接続の作成が試行されるたびに呼び出されます。

すべての接続作成操作によって、そのコンシューマが受け入れられます。たとえば、接続流用リクエストに対してトリガーしたり、一部のUCPワーカー・スレッドでトリガーしてプール・サイズの最小プロパティを維持し、不良接続を置き換えることができます。
この項では、接続作成コンシューマを実装する方法について説明します。

ノート:

プールの接続を作成するスレッドで登録済コンシューマが実行されたら、コールや集中的な計算をブロックせずに実装する必要があります。

例4-1 コンシューマの登録

次のコード・スニペットは、コンシューマを登録する方法を示しています。

import oracle.ucp.ConnectionCreationInformation;
import java.util.function.Consumer;
... rest of imports ...
 
  ...
  final PoolDataSource pds = new PoolDataSourceFactory.getPoolDataSource();
  ... configure pds ...
  final Consumer<ConnectionCreationInformation> consumer = p -> { ... };
  pds.registerConnectionCreationConsumer(consumer);
  ...

コンシューマが登録されると、すべての接続作成操作によって、登録済コンシューマの受入れコールがトリガーされます。

例4-2 コンシューマの登録解除

次のコード・スニペットは、コンシューマを登録解除する方法を示しています。

import oracle.ucp.ConnectionCreationInformation;
import java.util.function.Consumer;
... rest of imports ...
 
  ...
  final PoolDataSource pds = new PoolDataSourceFactory.getPoolDataSource();
  ... configure pds ...
  final Consumer<ConnectionCreationInformation> consumer = p -> { ... };
  pds.registerConnectionCreationConsumer(consumer);
  ...
  pds.unregisterConnectionCreationConsumer();
  ...

コンシューマが登録解除されると、プール内の接続作成リクエストごとにコンシューマの受入れコールが発生することはなくなります。

例4-3 接続作成ステータスの検証

次のコード・スニペットは、接続の作成が成功したか失敗したかを確認する方法を示しています。


...
final Consumer<ConnectionCreationInformation> consumer = p -> {
  if (p.getStatus() == ConnectionCreationInformation.Status.SUCCESSFUL) {
    ... handle successful connection creation code path...
  }
 
  if (p.getStatus() == ConnectionCreationInformation.Status.FAILURE) {
    ... handle unsuccessful connection creation code path...
  }
 
  ... };

例4-4 失敗した接続作成の処理

接続作成操作が失敗すると、受け入れたコンシューマは対応するSQLExceptionベンダー・エラー・コードをスローします。次のコード・スニペットは、エラーの処理方法を示しています。


...
final Consumer<ConnectionCreationInformation> consumer = p -> {
  if (p.getStatus() == ConnectionCreationInformation.Status.FAILURE) {
    final int errorCode = p.getErrorCode();
    ... do some error code path...
  }
 
  ... };

例4-5 成功した接続に関する情報の取得

次のコード・スニペットは、正常に作成された接続に関する情報を取得する方法を示しています。


...
final Consumer<ConnectionCreationInformation> consumer = p -> {
  if (p.getStatus() == ConnectionCreationInformation.Status.SUCCESSFUL) {
    // Net Connection ID for an appropriate connection.
    final String netConnId = getNetConnectionId();
 
    // database instance (if applicable) name, on which connection was created.
    final String instanceName = getInstanceName();
 
    // database service (if applicable) name, on which connection was created.
    final String serviceName = getServiceName();
  
    // database host (if applicable) name, on which connection was created.
    final String hostName = getHostName();
  
    // database unique ID for created connection.
    final String dnUniqId = getDatabaseUniqId();
  
    // database instance (if applicable) unique ID for created connection.
    final String instanceId = getInstanceId();
  
    // Security information for created connection.
    final SecurityInformation securityInfo = getSecurityInformation();
  
    ... rest of successful connection creation code path ...
  }
  ... };