13.2 シャード・データベースの接続リクエストの処理について

この項では、シャード・データベースのプールで接続リクエストを行う方法について説明します。

13.2.1 シャーディング・キーを使用したプールからの接続のチェックアウト方法

接続がUCPから流用される場合、シャード認識アプリケーションでは、PoolDataSourceクラスに存在する新しい接続ビルダーを使用して、シャーディング・キーおよびスーパー・シャーディング・キーを提供できます。

シャーディング・キーが存在しない場合またはデータベース・メタデータで指定されたデータ型にマップされない場合、IllegalArgumentExceptionがスローされます。次のコードでは、シャーディング・キーを使用した接続のチェックアウト方法を示します。

例13-1 シャーディング・キーを使用した接続のチェックアウト

import java.sql.Connection;
import java.sql.JDBCType;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.ShardingKey; 

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory; 

public class UCPShardingExample {  

  public static void main(String[] args) throws SQLException {  
      String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=myhost)(PORT=<gsm_port>)(PROTOCOL=tcp))(CONNECT_DATA=(SERVICE_NAME=myGSMservice)))";
      String user="db_user_name";
      String pwd = "db_password";
    
      PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
      pds.setURL(url);
      pds.setUser(user);
      pds.setPassword(pwd);
      pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
      pds.setInitialPoolSize(5);
      pds.setMinPoolSize(5);
      pds.setMaxPoolSize(20);
            
      int empId = 1234;
      // Employee ID is the sharding key column in sharded table

      ShardingKey shardingKey = pds.createShardingKeyBuilder()
                                   .subkey(empId, JDBCType.INTEGER)
                                   .build();
    
      // Borrow a connection to direct shard using sharding key
      try(Connection connection = pds.createConnectionBuilder()
              .shardingKey(shardingKey)
              .build()) {

                          PreparedStatement pst = connection.prepareStatement("select * from employee where emp_id=?");
                          pst.setInt(1, 1234);
                          ResultSet rs = pst.executeQuery();
                          // retrieve the employee details using resultset
                          rs.close();
                          pst.close();
                        }
      }

  }

ノート:

接続チェックアウト中にシャーディング・キーを指定する必要があります。それ以外の場合、エラーまたは例外がアプリケーションにスローされます。

13.2.2 シャードごとの接続数の構成について

UCPがシャード・データベースのプール接続に使用される場合、プールには、異なるシャードの接続が含まれます。そのため、接続を取得する場合、すべてのシャードのプール容量の相当な使用が接続されていることを確認するために、UCPはMaxConnectionsPerShardパラメータを使用します。これは、シャード・データベースの各シャードに適用されるグローバル・パラメータで、接続の合計数を指定された制限を下回るシャードに制限するために使用されます。

次の表に、このパラメータを設定および取得するAPIを示します。

メソッド 説明
poolDatasource.setMaxConnectionsPerShard(<max_connections_per_shard_limit>) シャード当たりの最大接続数を設定します。
poolDatasource.getMaxConnectionsPerShard() setMaxConnectionsPerShard(<max_connections_per_shard_limit>)メソッドを使用して設定された値を取得します。

ノート:

Oracle Golden Gate構成を使用したシャード・データベースでMaxConnectionsPerShardパラメータを使用できません。

13.2.3 複数のシャード問合せのシャード・カタログまたはコーディネータへの接続について

複数のシャード問合せを実行するためにシャード・カタログまたはコーディネータに接続する場合、新しいPoolDataSourceインスタンスを使用して、個別のプールを作成することをお薦めします。コーディネータ・サービスで作成されるデータソースから取得した接続で複数のシャード問合せを実行できます。コーディネータの接続リクエストには、接続ビルダーAPIのシャーディング・キーが含まれません。