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 シャーディング・キーを使用したプールからの接続のチェックアウト方法
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はキャッシュを使用してリクエストを正しいシャードにリダイレクトします。高速パス接続流用と呼ばれるこの機能により、リクエストされたシャーディング・キーに基づいてプールの接続の効率的な再利用を可能にします。また、この機能により、リクエストをルーティングするためにシャード・データベースに移動することを回避できます。