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

次の項では、ユニバーサル接続プール(UCP)がシャード・データベースの接続リクエストを処理する方法について説明します。

11.2.1 シャーディング・キーの作成について

シャード認識アプリケーションは、シャードされたデータベースへの接続の確立に必要なシャーディング・キーおよびスーパー・シャーディング・キーを識別して作成する必要があります。これを実行するには、シャード認識アプリケーションでOracleShardingKeyおよびOracleShardingKeyBuilderインタフェースを使用する必要があります。

OracleShardingKeyBuilderは、データ型が異なる複合キーをサポートするために次のビルダー・メソッドを使用します。

subkey(Object subkey, java.sql.SQLTYPE subkeyDataType)

各サブキーのデータ型が異なる可能性がある複合シャーディング・キーを作成するには、ビルダーでsubkeyメソッドを複数回起動します。データ型は、oracle.jdbc.OracleType列挙またはjava.sql.JDBCTypeを使用して定義できます。

例11-1 シャーディング・キーの作成

次の例は、シャーディング・キーの作成方法を示します。

import java.sql.Connection;
import java.sql.Date;
import java.sql.SQLException;
import java.sql.Statement;

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

  public class ShardExample
  {   
    public static void main(String[] args) throws SQLException
    {   
      String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=myhost)(PORT=3216)(PROTOCOL=tcp))(CONNECT_DATA=(SERVICE_NAME=myservice)(REGION=east)))";
      String user="testuser1";
      String pwd = "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);
                 
      // build the sharding key object
      Date shardingKeyVal = new java.sql.Date(0L);
      OracleShardingKey sdkey = pds.createShardingKeyBuilder()
                                   .subkey(shardingKeyVal, OracleType.DATE)
                                   .build();
      
      Connection conn = pds.createConnectionBuilder()
                            .shardingKey(sdkey)
                            .build();
     
      Statement stmt = conn.createStatement();
      stmt.execute("... SQL statement here ...");
      stmt.close();
      conn.close();
    }
  }

次のコードでは、Stringデータ型とDateデータ型で構成される複合シャーディングの作成方法を示します。

...
Date shardingKeyVal = new java.sql.Date(0L);
...
OracleShardingKey shardingKey = datasource.createShardingKeyBuilder()
				          .subkey("abc@xyz.com", JDBCType.VARCHAR)
				          .subkey(shardingKeyVal, OracleType.DATE)
				          .build();
...

注意:

  • 有効でサポートされているデータ型の固定のセットがあります。サポートされていないデータ型をキーとして使用すると、例外が発生します。次のリストに、サポートされているデータ型を示します。

    • OracleType.VARCHAR2/JDBCType.VARCHAR

    • OracleType.CHAR/JDBCType.CHAR

    • OracleType.NVARCHAR/JDBCType.NVARCHAR

    • OracleType.NCHAR/JDBCType.NCHAR

    • OracleType.NUMBER/JDBCType.NUMERIC

    • OracleType.FLOAT/ JDBCType.FLOAT

    • OracleType.DATE/ JDBCType.DATE

    • OracleType.TIMESTAMP/JDBCType.TIMESTAMP

    • OracleType.TIMESTAMP_WITH_LOCAL_TIME_ZONE

    • OracleType.RAW

  • データベースで指定されているNLS書式に準拠したシャーディング・キーを指定する必要があります。

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

接続がUCPから流用される場合、シャード認識アプリケーションでは、PoolDataSourceクラスに存在する新しい接続ビルダーを使用して、シャーディング・キーおよびスーパー・シャーディング・キーを提供できます。シャーディング・キーが存在しない場合またはデータベース・メタデータで指定されたデータ型にマップされない場合、IllegalArgumentExceptionがスローされます。次のコードでは、シャーディング・キーを使用した接続のチェックアウト方法を示します。
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
...
Connection conn = pds.createConnectionBuilder()
// Establish a connection using sharding key and super sharding key
		     .shardingKey(shardingKey) 
		     .superShardingKey(superShardingKey)
		     .build();

OracleShardingKey shardKey = pds.createShardingKeyBuilder() 
// Build a compound sharding key with email address and customer ID as the two sharding keys
				.subkey(<email>, OracleType.VARCHAR2)
				.subkey(<custid>, OracleType.NUMBER)
				.build();

OracleShardingKey superShardKey = pds.createShardingKeyBuilder() 
// Build a super sharding key with the customer region
				     .subkey(<cust_region>, OracleType.VARCHAR2)
				     .build();

注意:

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

11.2.3 シャーディング・キーを提供しない接続のチェックアウトについて

シャード・データベースに接続するためにUCPデータ・ソースを使用する場合、接続ビルダーAPIを介して接続リクエストのシャーディング・キーを提供することは必須です。シャーディング・キーを提供しない場合、例外がユーザーにスローされます。

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

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

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

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

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

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

注意:

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

11.2.6 接続チェックアウト中のプール接続選択アルゴリズム

シャード・データベースの異なるシャードにUCPを介して新しい接続が作成される場合は常に、プールは内部的にシャード・ルーティング・キャッシュを追加的に学習して作成します。

ルーティング・キャッシュは、シャーディング・キーをキーが存在する各シャードにマップします。特定のシャーディング・キーを使用して接続リクエストに対してプールの接続を検索する場合、UCPはキャッシュを使用してリクエストを正しいシャードにリダイレクトします。高速パス接続流用と呼ばれるこの機能により、リクエストされたシャーディング・キーに基づいてプールの接続の効率的な再利用を可能にします。また、この機能により、リクエストをルーティングするためにシャード・データベースに移動することを回避できます。

11.2.7 UCPでのエラー処理のフェイルオーバーまたは再シャーディング

再シャーディングまたはフェイルオーバー・イベントの後、UCPシャード・ルーティング・キャッシュとサーバーのデータを同期しようとします。データベースの様々な変更のためにONS通知へサブスクライブすることで、キャッシュは最新のままです。