
目次
はじめに。
こんにちは、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インスタンスに接続するまでの流れをご紹介します。
構築の流れ
今回は以下のような流れで構築していきます。
前提条件
前提条件は以下の通りです。
- True Cacheが構築済みであること
※導入の詳細は前回記事「【Oracle 23ai 新機能】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
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.
リスナーのサービス設定を確認し、TESTとTEST_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についてお困りのことがあれば是非当社へお問い合わせください!

投稿者プロフィール
