中間層とシャード間のアフィニティの作成
中間層ルーティングを使用すると、高機能のルーターがシャーディング・キーに関連付けられた中間層にルーティングできるようになります。
中間層ルーティングAPIを使用すると、シャード・データベース・トポロジをルーター層に公開して、特定のシャーディング・キーに基づくリクエストが適切なアプリケーション中間層にルーティングされ、そこから特定のシャード・サブセットに対して接続が確立されるようにできます。
一般的なシャード・データベース環境では、中間層接続プールはデータベース・リクエストを特定のシャードにルーティングします。このため、各中間層接続プールが各シャードへの接続を確立する状況をまねくことがあります。この場合、データベースへの接続が多くなりすぎる可能性があります。この問題は、中間層とシャード間にアフィニティを作成することで解決できます。このシナリオでは、各データ・センターまたはクラウドに中間層(Webサーバー、アプリケーション・サーバー)を確保し、クライアント・データ(クライアント・シャーディング・キーに対応する)を含むシャードが存在する中間層にクライアント・リクエストを直接ルーティングすることが理想的です。この種の設定によく使用される用語はスイム・レーンです。各スイムレーンは、Webサーバーからアプリケーション・サーバー、データベースへと至る専用のスタックです。
Oracle Universal Connection Pool (UCP)は、関連する中間層にクライアント・リクエストをルーティングするために使用できる中間層ルーティングAPIを提供することで、この問題を解決します。UCP中間層APIは、OracleShardRoutingCache
クラスによって公開されます。このクラスのインスタンスはUCP内部シャード・ルーティング・キャッシュを表し、ユーザー、パスワード、URLなどの接続プロパティを指定して作成できます。ルーティング・キャッシュは、シャーディング・カタログに接続して、シャード・マッピング・トポロジへのキーを取得し、キャッシュに格納します。
ルーティング・キャッシュはUCP中間層API getShardInfoForKey(shardKey,superShardKey)
によって使用されます。これは、シャーディング・キーを入力として受け入れ、入力シャーディング・キーにマップされたShardInfo
インスタンスのセットを返します。ShardInfo
インスタンスは、シャードの一意のシャード名と優先度をカプセル化します。中間層APIを使用するアプリケーションは、戻された一意のシャード名の値を、特定のシャードへの接続がある中間層にマップできます。ルーティング・キャッシュは、各ONSイベントをサブスクライブすることによってチャンクの分割または他のシャードへの移動時に自動的に更新されます。
次のコード例は、Oracle UCP中間層ルーティングAPIの使用方法を示しています。
例17-1 UCP APIを使用した中間層ルーティング
import java.sql.SQLException;
import java.util.Properties;
import java.util.Random;
import java.util.Set;
import oracle.jdbc.OracleShardingKey;
import oracle.jdbc.OracleType;
import oracle.ucp.UniversalConnectionPoolException;
import oracle.ucp.routing.ShardInfo;
import oracle.ucp.routing.oracle.OracleShardRoutingCache;
/**
* The code example illustrates the usage of UCP's mid-tier routing feature.
* The API accepts sharding key as input and returns the set of ShardInfo
* instances mapped to the sharding key. The ShardInfo instance encapsulates
* unique shard name and priority. The unique shard name then can be mapped
* to a mid-tier server which connects to a specific shard.
*
*/
public class MidtierShardingExample {
private static String user = "testuser1";
private static String password = "testuser1";
// catalog DB URL
private static String url = "jdbc:oracle:thin:@//hostName:1521/catalogServiceName";
private static String region = "regionName";
public static void main(String args[]) throws Exception {
testMidTierRouting();
}
static void testMidTierRouting() throws UniversalConnectionPoolException,
SQLException {
Properties dbConnectProperties = new Properties();
dbConnectProperties.setProperty(OracleShardRoutingCache.USER, user);
dbConnectProperties.setProperty(OracleShardRoutingCache.PASSWORD, password);
// Mid-tier routing API accepts catalog DB URL
dbConnectProperties.setProperty(OracleShardRoutingCache.URL, url);
// Region name is required to get the ONS config string
dbConnectProperties.setProperty(OracleShardRoutingCache.REGION, region);
OracleShardRoutingCache routingCache = new OracleShardRoutingCache(
dbConnectProperties);
final int COUNT = 10;
Random random = new Random();
for (int i = 0; i < COUNT; i++) {
int key = random.nextInt();
OracleShardingKey shardKey = routingCache.getShardingKeyBuilder()
.subkey(key, OracleType.NUMBER).build();
OracleShardingKey superShardKey = null;
Set<ShardInfo> shardInfoSet = routingCache.getShardInfoForKey(shardKey,
superShardKey);
for (ShardInfo shardInfo : shardInfoSet) {
System.out.println("Sharding Key=" + key + " Shard Name="
+ shardInfo.getName() + " Priority=" + shardInfo.getPriority());
}
}
}
}