この記事はLudovico CaldaraによるTrue Cache and Active Data Guard Transparent JDBC Redirectionを日本語に翻訳したものです。

2025年3月31日


Oracle Database 23aiでは、アプリケーションのパフォーマンスとスケーラビリティを向上させるために設計されたインメモリSQLキャッシュであるTrue Cacheが導入されています。True Cacheはプライマリ・データベースから直接データを取得し、メモリーに格納することで、True Cacheバッファ・キャッシュ内でデータの一貫性と最新性を維持します。
従来の外部キャッシュ・ソリューションでよく問題となる、手動による一貫性管理や無効化といった作業は不要です。True Cacheは、アプリケーションがキャッシュ・トポロジを認識する必要がある従来の外部キャッシュとは異なり、Oracle Databaseの動的なサービス登録によって複雑さを隠蔽し、キャッシュ管理を効率化し、アーキテクチャ上の課題を軽減します。

True Cacheへの接続は、次の2つの方法で実現できます。

2つのデータ・ソース

アプリケーションは、プライマリ・データベースに接続するデータ・ソースとTrue Cacheインスタンスに接続するデータ・ソースの2つ(またはそれ以上)を定義できます。これらのデータ・ソースは、Connection Managerまたはリモート・リスナーがオプションで提供して、透過的な負荷分散、多重化、およびSQL*Net構成の簡素化を実現できます。

次の図とコードは、2つのデータ ソース (例ではods_rwods_tc)を使用するアプリケーションを示しています。

The diagram shows an application using two data sources to connect respectively to the primary service and the True Cache service.

import oracle.jdbc.datasource.impl.OracleDataSource;
OracleDataSource ods_rw = new OracleDataSource();
ods_rw.setURL(url_app_rw);
...
try (Connection conn_rw = ods_rw.getConnection()) {
    // This is connected to the Primary
} catch (SQLException sqex) {
    ...
}
OracleDataSource ods_tc = new OracleDataSource();
ods_tc.setURL(url_app_tc);
...
try (Connection conn_tc = ods_tc.getConnection()) {
    // This is connected to True Cache
} catch (SQLException sqex) {
    ...
}


この方法は、レプリカを活用して読み取り専用ワークロードをオフロードするアプリケーションや、Command Query Responsibility Segregation(コマンドクエリ責任分離(CQRS))パターンを実装する場合に、長年広く使用されてきました。
これは、True Cacheに接続するための最も柔軟な方法です。アプリケーション・サーバーは、専用のTrue Cacheインスタンスに接続することができ、同じ仮想マシン(VM)、ポッド、または類似環境など、同じインフラストラクチャ内でホストすることもできます。

透過的リダイレクションによる1つのデータ・ソース

JDBC Thinドライバを使用するアプリケーションは、単一のデータ・ソースを使用して、よりシンプルな接続とコード記述を選択することもできます。デフォルトでは、接続はプライマリ・サービスに送られます。それでも、接続が読み取り専用に設定されている場合には、読み取り専用モードが解除されるまで、後続のクエリーは透過的にTrue Cacheサービスにリダイレクトされます。

次の図とコードは、True Cacheドライバ接続を使用して単一のデータ・ソースを使用し、必要に応じて接続を読み取り専用に設定するアプリケーションを示しています:

The diagram shows the application using a single data source to connect to the database, and the connection goes transparently to the primary service or the True Cache service depending on setReadOnly()

import oracle.jdbc.datasource.impl.OracleDataSource;
OracleDataSource ods = new OracleDataSource();
ods.setURL(url_app);
...
ods.setConnectionProperty(
    "oracle.jdbc.useTrueCacheDriverConnection", "true");
try (Connection conn = ods.getConnection()) {
    // This is connected to the Primary
    
    conn.setReadOnly(true);
    // This is connected to the True Cache
} catch (SQLException sqex) {
    ...
}


True Cacheの透過的リダイレクトはどのように機能しますか?

True Cacheインスタンスは、プライマリ・データベースと同じエンドポイントにサービスを登録する必要があります。これは、プライマリ・データベースのリスナー、 SCANリスナーリモート・リスナーConnection Manager、または グローバル・データ・サービス・インフラストラクチャのいずれかです。
True Cache対応アプリケーションを提供するプライマリ・サービスを作成するには、True Cacheのサービス名に対応する追加のパラメータが必要です。

srvctl add service -db APPCDB -service APP_RW -pdb APPPDB -true_cache_service APP_TC

(詳細についてはサーバー制御ユーティリティのリファレンスを参照ください。)

DBMS_SERVICEパッケージは、 Grid Infrastructureを使用しないデータベース・デベロップメントでも同じプロパティをサポートします。

DECLARE
    db_params dbms_service.svc_parameter_array;
BEGIN
   db_params('true_cache_service') := 'APP_TC';
   DBMS_SERVICE.CREATE_SERVICE('APP_RW', 'APP_RW', db_params);
END;


When the JDBC 23aiドライバがプライマリ・サービスに接続すると自動的True Cacheサービス名を取得し、それを使用してそのサービスが登録されている同じエンドポイントに接続を確立します。

この機能を有効にするには、 OracleDataSource接続にuseTrueCacheDriverConnectionプロパティを設定する必要があります:

ods1.setConnectionProperty("oracle.jdbc.useTrueCacheDriverConnection", "true");

この時点で、アプリケーションが接続を読み取り専用に設定するたびに:

java.sql.Connection.setReadOnly(true);

ドライバは透過的にTrue Cacheサービスにリクエストを送信します。

Mavenを使用する場合、最新のドライバ(23.7.0.25.01記事執筆時点)を使用してください:

    <dependencies>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc11</artifactId>
            <version>23.7.0.25.01</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ucp11</artifactId>
            <version>23.7.0.25.01</version>
        </dependency>
    </dependencies>

True Cacheリダイレクトは、Active Data Guardでも動きます!

JDBCドライバが、True Cacheインスタンスの場合と同様に、読み取り専用ステートメントをActive Data Guardスタンバイデータベースにシームレスにリダイレクトできると想像してみてください。朗報です – それができるのです!このリダイレクトはJDBC、サービス、リスナーの各レベルで機能するため、True Cacheは必須ではありません。

True Cacheの読み書き可能なプライマリ・データベース・サービスを、Active Data Guardが使用する読み取り専用サービスを指すように構成できます。Active Data Guardスタンバイ・データベースでは、プライマリ・データベースと同じリスナー・エンドポイント(リモート・リスナーSCANCMAN、または

GDSが利用可能)に読み取り専用サービスを登録し、必要に応じてjava.sql.Connection.setReadOnly(boolean)を使用して開発を開始できます。
ただし、各読み書きサービスには1つのTrue Cacheサービスしか設定できないため、複数のアプリケーション・データソースを使用せずにActive Data GuardとTrue Cacheを混在させることはできません。

以下の図は、前の図ととても似ていますが、True Cacheドライバ接続がActive Data Guardのスタンバイ・データベースと透過的に動作することを示しています:

 

詳細情報:
Oracle True Cacheユーザーズ・ガイド – 2.3.3 True Cacheデータベース・アプリケーション・サービスの手動構成

 

開発者にとってのメリットは何ですか?

True CacheとJDBCリダイレクトを活用することで、開発者はこれまでのキャッシュ・ソリューションの複雑さに煩わされることなく、より効率的で高性能なアーキテクチャを実現できます。 True Cacheは、手動での無効化や一貫性のチェックを必要とする外部キャッシュの必要性を排除し、データベースに直接統合された最新のインメモリSQLキャッシュを提供します。 また、JDBCリダイレクトは、読み取り専用クエリをTrue CacheまたはActive Data Guardスタンバイ・データベースにシームレスにルーティングすることで接続管理を簡素化し、アプリケーションを変更することなくリソースの利用効率を最適化します。このアプローチは、運用上のオーバーヘッドを発生させることなくスケーラビリティと応答時間を向上させ、耐障害性の高いデータベース駆動型アプリケーションの構築を容易にします。


このブログの着想をくれたSebastian Solbach氏に感謝します。