はじめに。

こんにちは、Oracle Databaseの検証チームです。
前回は、Oracle database 23aiの新機能であるTrue Cacheの紹介・導入記事を作成しました。
今回はその続編です!
JDBC Thin driverを使用して、True Cacheインスタンスに接続してみました。

JDBC Thin ドライバを使用することでURLを変更することなく、容易にプライマリデータベースから True Cache に接続を切り替えることができるようになります。

「【Oracle 23ai 新機能】True Cacheを紹介・導入してみました」
の記事もぜひご覧ください!

True Cacheの活用

JDBC Thin driverを使用して、True Cacheインスタンスに接続するまでの流れをご紹介します。

構築の流れ

今回は以下のような流れで構築していきます。

    1. tnsnames.oraにサービス名を登録(両ノード)
    2. VNCRの有効化(プライマリノード
    3. True Cache向けサービスの作成(プライマリノード)
    4. Javaインストール(True Cacheノード)
    5. Javaプログラムのコンパイル(True Cacheノード)

前提条件

前提条件は以下の通りです。

  • OCIのコンピュートインスタンスを利用すること
  • 作成済みのVCNおよび以下2つのLinuxインスタンスがあること
    • プライマリノード:instance-db23ai
    • True Cacheノード:instance-truecache23ai

1.tnsnames.oraにサービス名を登録(両ノード)

tnsnames.oraにプライマリノードとTrue Cacheノードのサービス名を登録します。

[oracle@instance-truecache23ai .ssh]$ vi /$ORACLE_HOME/network/admin/tnsnames.ora
-- 下記を追記

freepdb1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = instance-db23ai)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = freepdb1)
)
)

free_tc =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = instance-truecache23ai)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = freepdb1)
)
)

[oracle@instance-truecache23ai .ssh]$ cat /$ORACLE_HOME/network/admin/tnsnames.ora
-- 変更内容が想定通りであることを確認

2.VNCRの有効化(プライマリノード

Oracle True Cache User’s Guide
– 2.2.3 Configuring True Cache with Oracle DBCA

こちらのマニュアルによるとValid Node Checking for Registration (VNCR) を有効化する必要があるみたいです。
その為、プライマリノードで有効化を行います。
12c以降では、リモート・インスタンスの登録がデフォルトでは許可されていないため、サブネット上のすべてのマシンで許可するようにします。

[oracle@instance-db23ai admin]$vi listener.ora
-- 下記を追記

VALID_NODE_CHECKING_REGISTRATION_LISTENER = SUBNET
REGISTRATION_INVITED_NODES_LISTENER=(instance-db23ai)

[oracle@instance-db23ai admin]$cat listener.ora
-- 変更内容が想定通りであること

設定を有効化するため、リスナーをリロードします。

[oracle@instance-db23ai admin]$ lsnrctl reload

3.True Cache向けサービスの作成(プライマリノード

プライマリノードのPDBに接続し、アプリケーション接続用のサービスを作成します。
今回は「TEST」というサービス名にしています。
また、PDB名は23ai-freeのデフォルトである「FREEPDB1」を使用しています。

SQL*Plus: Release 23.0.0.0.0 - Production on Fri Apr 18 05:52:31 2025
Version 23.7.0.25.01

Copyright (c) 1982, 2025, Oracle.  All rights reserved.


Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.7.0.25.01

SQL> 
SQL> alter session set container=FREEPDB1;
Session altered.
SQL> 
SQL> BEGIN
  2     DBMS_SERVICE.CREATE_SERVICE('TEST', 'TEST');
  3     DBMS_SERVICE.START_SERVICE('TEST');
  4  END;
  5  /
PL/SQL procedure successfully completed.
SQL> 
SQL> col name for a10
SQL> col true_cache_service for a20
SQL> select service_id, name, true_cache_service FROM v$active_services WHERE name='TEST';

SERVICE_ID NAME       TRUE_CACHE_SERVICE
---------- ---------- --------------------
	 1 TEST

-- TRUE_CACHE_SERVICEが空欄であること

SQL> 
SQL> exit
DBCAを使用して、True Cache用サービスをプライマリデータベースに登録します。
True Cacheに接続するためのサービス名はTEST_TCとしています。
[oracle@instance-db23ai ~]$ dbca -configureDatabase -configureTrueCacheInstanceService -sourceDB FREE -trueCacheConnectString instance-truecache23ai:1521/FREE -trueCacheServiceName TEST_TC -serviceName TEST -pdbName FREEPDB1 -silent
(中略)
-----------------
Running Start_truecache_service job
Completed Start_truecache_service job
93% complete
-----------------
Running Enable_service_registration job
Completed Enable_service_registration job
100% complete
Look at the log file "/opt/oracle/cfgtoollogs/dbca/FREE/FREE39.log" for further details.

リスナーのサービス設定を確認し、TESTTEST_TCが登録されていることを確認します。

[oracle@instance-db23ai admin]$ lsnrctl services
(略)
Service "TEST" has 1 instance(s).
  Instance "FREE", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:2 refused:0 state:ready
         LOCAL SERVER

Service "TEST_TC" has 1 instance(s).
  Instance "FREE", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=instance-truecache23ai.sub08230824010.vcndbteamtokyo.oraclevcn.com)(PORT=1521))
(略)

再度プライマリノードのPDBに接続し、TRUE_CACHE_SERVICEの値が追加されていることを確認します。

[oracle@instance-db23ai ~]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Fri Apr 18 05:52:31 2025
Version 23.7.0.25.01

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.7.0.25.01

SQL> 
SQL> alter session set container=FREEPDB1;

Session altered.

PL/SQL procedure successfully completed.

SQL> 
SQL> col name for a10
SQL> col true_cache_service for a20
SQL> select service_id, name, true_cache_service FROM v$active_services WHERE name='TEST';

SERVICE_ID NAME       TRUE_CACHE_SERVICE
---------- ---------- --------------------
	 1 TEST           TEST_TC

-- TRUE_CACHE_SERVICEの値がTEST_TCであること

4.Javaインストール(True Cacheノード

Javaプログラムを実行するノードに、コンパイラjavacをインストールします。
今回はTrue Cacheノード上にインストールし、True CacheノードからJavaプログラムを実行します。

最初に、Javaをインストールします。
rootユーザで実行しましょう

[root@instance-truecache23ai ~]# dnf -y install java-11-openjdk-devel
(略)
   libthai-0.1.27-2.el8.x86_64
   libtiff-4.0.9-33.el8_10.x86_64
   libwayland-client-1.21.0-1.el8.x86_64
   libwayland-cursor-1.21.0-1.el8.x86_64
   libwayland-egl-1.21.0-1.el8.x86_64
   lua-5.3.4-12.el8.x86_64
   pango-1.42.4-8.el8.x86_64
   rest-0.8.1-2.el8.x86_64
   ttmkfdir-3.0.9-54.el8.x86_64
   tzdata-java-2025b-1.0.1.el8.noarch
   xorg-x11-font-utils-1:7.5-41.el8.x86_64
   xorg-x11-fonts-Type1-7.5-19.el8.noarch                
Complete!       

次にjdbcドライバucpドライバの存在を確認します

[root@instance-truecache23ai ~]# java -jar /opt/oracle/product/23ai/dbhomeFree/jdbc/lib/ojdbc11.jar
 
==============================================================
===  ___                 _            _ ____  ____   ____  ===
==  / _ \ _ __ __ _  ___| | ___      | |  _ \| __ ) / ___|  ==
=  | | | | '__/ _` |/ __| |/ _ \  _  | | | | |  _ \| |       =
== | |_| | | | (_| | (__| |  __/ | |_| | |_| | |_) | |___   ==
=== \___/|_|  \__,_|\___|_|\___|  \___/|____/|____/ \____| ===
===                                                        ===
========================================= v.23.7.0.25.01 =====
 
Oracle 23.7.0.25.01 JDBC 4.3 debug compiled with javac 11.0.26 on Fri_Jan_17_15:32:30_PST_2025
 
Try 'java -jar ojdbc11.jar help' for more information.

-- ucpファイルの存在を確認
[oracle@instance-truecache23ai .ssh]$ ls -l /opt/oracle/product/23ai/dbhomeFree/jdbc/lib/
total 23060
(略)
-rw-r--r--. 1 opc opc 1503025 Apr 18 06:05 ucp-23.7.0.25.01.jar

-- 最新バージョンのucpドライバが存在すること

本検証機ではucpドライバが存在しなかったため、jdbcドライバと同じバージョンのucpドライバを配置しておきました。

5.Javaプログラムのコンパイル(True Cacheノード)

テスト用プログラムTrueCache.javaを作成します。
今回は下記マニュアルに掲載されていたサンプル・コードを使用します。
JDBC Thinドライバを使用するサンプルJavaコード

注)本サンプル・コードを本番環境で利用しないでください。

import java.sql.*;
import java.io.*;
import java.util.*;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

import oracle.jdbc.driver.OracleLog;
import oracle.jdbc.pool.OracleDataSource;

public class TrueCache {
    static String url_primary = "jdbc:oracle:thin:@instance-db23ai:1521/TEST";
    static String user = "SYSTEM";
    static String password = "Password1";

    public static void main(String args[]) {
        try {
            TrueCache t = new TrueCache();
            if(args != null && args.length >0 ) {
                url_primary = args[0];
                user = args[1];
                password = args[2];
            }
            t.test1();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void test1() throws SQLException {
        show("Basic test to connect to primary and True Cache");
        try {
            show("Get Connection from True Cache instance using primary db and properties");
            OracleDataSource ods1 = new OracleDataSource();
            show("URL = " + url_primary);
            ods1.setURL(url_primary);
            ods1.setUser(user);
            ods1.setPassword(password);
            ods1.setConnectionProperty("oracle.jdbc.useTrueCacheDriverConnection", "true");

            Connection conn1 = ods1.getConnection();

            show("isReadonly " + conn1.isReadOnly());
            verifyConnection(conn1);  // This is connected to Primary

            conn1.setReadOnly(true);
            show("isReadonly " + conn1.isReadOnly());
            verifyConnection(conn1); // This is connected to True Cache

            conn1.close();
        } catch (SQLException sqex) {
            show("test1 -- failed" + sqex.getMessage()+":"+sqex.getCause());
            sqex.printStackTrace();
        }
        show("The end");
    }

    public void verifyConnection(Connection conn) {
        try {
            Statement statement = conn.createStatement();
            ResultSet rs = statement.executeQuery("SELECT database_role from v$database");
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnsNumber = rsmd.getColumnCount();
            rs.next();
            show("Database role : " + rs.getString(1));
            rs.close();
            ResultSet resultSet = statement.executeQuery("SELECT SYS_CONTEXT('userenv', 'instance_name') as instance_name"
                    + ", SYS_CONTEXT('userenv', 'server_host')" + " as server_host" + ", SYS_CONTEXT('userenv', 'service_name')"
                    + " as service_name" + ", SYS_CONTEXT('USERENV','db_unique_name')" + " as db_unique_name" + " from sys.dual");
            resultSet.next();
            show("instance_name : " + resultSet.getString("instance_name"));
            show("server_host : " + resultSet.getString("server_host"));
            show("service_name : " + resultSet.getString("service_name"));
            show("db_unique_name : " + resultSet.getString("db_unique_name"));
            resultSet.close();
            statement.close();
        } catch (SQLException sqex) {
            show("verifyConnection failed " + sqex.getMessage());
        }
    }

    public void show(String msg) {
        System.out.println(msg);
    }
}

上記プログラムをTrueCache.javaとして/home/oracle/JavaTest配下に保存しました。
コンパイルを実行します。

[oracle@instance-truecache23ai]$ cd /home/oracle/JavaTest
[oracle@instance-truecache23ai JavaTEST]$ java -classpath /opt/oracle/product/23ai/dbhomeFree/jdbc/lib/ojdbc11.jar:/opt/oraccle/product/23ai/dbhomeFree/jdbc/lib/ucp-23.7.0.25.01.jar TrueCache.java

[oracle@instance-truecache23ai JavaTEST]$ ls -l TrueCache.class
-rw-r--r--. 1 oracle oinstall 3873 Apr 18 07:38 TrueCache.class
-- classファイルが作成されていること

プログラムを実行し、True Cacheインスタンスに接続できることを確認します。

[oracle@instance-truecache23ai JavaTEST]$ java -classpath /opt/oracle/product/23ai/dbhomeFree/jdbc/lib/ojdbc11.jar:/opt/oraccle/product/23ai/dbhomeFree/jdbc/lib/ucp-23.7.0.25.01.jar TrueCache.java

Basic test to connect to primary and True Cache
Get Connection from True Cache instance using primary db and properties
URL = jdbc:oracle:thin:@instance-db23ai:1521/TEST
isReadonly false
Database role : PRIMARY
instance_name : FREE
server_host : instance-db23ai
service_name : TEST
db_unique_name : FREE
isReadonly true
Database role : TRUE CACHE
instance_name : FREE
server_host : instance-truecache23ai
service_name : TEST_TC
db_unique_name : FREE
The end

最後に

以上で、JDBC Thin driverを使用して、True Cacheインスタンスに接続することが出来ました。
皆さんも、本記事を参考に、True Cacheを使用してみてください。
最後まで読んで頂きありがとうございました!
またどこかでお会いしましょう。

OracleDBについてお困りのことがあれば是非当社へお問い合わせください!

投稿者プロフィール

技術チーム
技術チーム
DBひとりでできるもんを盛り上げるべく、技術チームが立ち上がり早8年。ひとりでできるもんと言いつつ、技術者が読んでプッとなるような、極めてピンポイントでマニアックな技術ネタを執筆しています!
最新技術情報や資格情報をチェックしたいアナタ!毎日遊びに来てください。きっとお役に立てます。