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.jdbc.pool.OracleDataSource;

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", pwd = password;
        
    OracleDataSource ods = new OracleDataSource();
    ods.setURL(url);
    ods.setUser(user);
    ods.setPassword(pwd);
                
    // build the sharding key object
    Date shardingKeyVal = new java.sql.Date(0L);
    OracleShardingKey sdkey = ods.createShardingKeyBuilder()
                                 .subkey(shardingKeyVal, OracleType.DATE)
                                 .build();
     
    Connection conn = ods.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通知へサブスクライブすることで、キャッシュは最新のままです。