13.6 UCPを使用した中間層ルーティング

Oracle Databaseリリース18c以降では、Oracle Universal Connection Pool (UCP)に中間層ルーティング機能が導入されています。この機能は、シャーディング機能を使用するOracleのユーザーが、クライアント・アプリケーションからシャード・データベースへの専用の中間層を使用できるようにします。

通常、中間層接続プールは、データベース・リクエストを特定のシャードにルーティングします。このようなルーティングでは、各中間層接続プールから各シャードへの接続が確立されるため、データベースへの接続が多くなりすぎます。中間層ルーティング機能は、各データ・センターまたはクラウド専用の中間層(Webサーバーまたはアプリケーション・サーバー)を持ち、クライアント・データ(クライアント・シャーディング・キーに対応する)を含むシャードが存在する関連する中間層にクライアント・リクエストを直接ルーティングすることで、この問題を解決します。

UCPのOracleShardRoutingCacheクラスは、クライアント・リクエストを適切な中間層にルーティングするために使用できる中間層ルーティングAPIを提供しています。このクラスのインスタンスは、UCPの内部シャード・ルーティング・キャッシュを表します。これは、シャーディング・カタログのユーザー、パスワード、URLなどの接続プロパティを指定することで作成できます。Oracle Databaseリリース19c以降では、新しい接続プロパティserviceNameも指定する必要があります。これはグローバル・サービスの名前です。

ルーティング・キャッシュは、シャーディング・カタログに接続し、シャード・マッピング・トポロジへのキーを取得してキャッシュに格納します。getShardInfoForKey(shardKey, superShardKey)メソッドは、UCPのルーティング・キャッシュを使用して、指定されたシャーディング・キーのシャードに関する情報を取得します。ShardInfoインスタンスは、シャードの一意のシャード名と優先度をカプセル化します。中間層APIを使用するアプリケーションは、返された一意のシャード名値を、指定されたシャードへの接続がある中間層にマップできます。

ルーティング・キャッシュは、各ONSイベントをサブスクライブすることによって、チャンクの移動または分割時に自動的にリフレッシュまたは更新されます。

13.6.1 中間層ルーティング・サポートのためのUCP API

OracleShardRoutingCacheクラス

このクラスは、UCPの内部シャード・ルーティング・キャッシュを拡張し、WebLogic Server、中間層ルーターまたはロード・バランサで基本ルーティング・キャッシュ機能を使用できるようにします。

publicクラスOracleShardRoutingCacheはShardRoutingCacheを拡張します

このクラスは、OracleShardRoutingCache(Properties dataSourceProps)メソッドおよびSet<ShardInfo> getShardInfoForKey(OracleShardingKey key, OracleShardingKey superKey)メソッドを提供します。

ShardInfoインタフェース

ShardInfoインタフェース・インスタンスは、一意のシャード名と優先度をカプセル化します。一意のシャード名は、特定のシャードに接続する中間層サーバーにマップできます。

13.6.2 UCPを使用した中間層ルーティングの例

次の例は、UCPの中間層ルーティングAPIの使用について説明しています。

例13-4 UCPを使用した中間層ルーティングの例

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 the middle-tier routing feature of UCP.  
 * 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 middle-tier server that 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());
      }
    }

  }
}