一部の GUI では、TNS ドライバー構成が実装されていないか、機能していません (たとえば、NetBeans :-) )
https://netbeans.org/bugzilla/show_bug.cgi?id=231526
ここに簡単な回避策があります。tnsnames.ora ファイルからエントリを直接取得し、次のように jdbc ドライバ文字列に添付できます。
odbc7.jar (JDK 7 用の Oracle 12c JDBC ドライバー) を使用して Oracle 11gR2 RAC クラスターに接続する例:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostA)(PORT=1522))(ADDRESS=(PROTOCOL=TCP)(HOST=hostB)(PORT=1521)) ))(SOURCE_ROUTE=はい)(CONNECT_DATA=(SERVICE_NAME=DatabaseService)))
次のように :: を末尾に付ける場合は、末尾に host:port:service のように :: 文字を 2 つ付けることに注意してください。
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostA)(PORT=1522))(ADDRESS=(PROTOCOL=TCP)(HOST=hostB)(PORT=1521)) ))(SOURCE_ROUTE=はい)(CONNECT_DATA=(SERVICE_NAME=DatabaseService)))::
「NL 例外が生成されました」という例外が発生します。
もう 1 つの方法は、次のプロパティを構成することです。
もちろん、ハードコードされた値の代わりに、たとえば ORACLE_TNS_ADMIN のような環境変数をオペレーティング システムに設定して参照することもできます。
System.setProperty("oracle.net.tns_admin",System.getenv("ORACLE_TNS_ADMIN"));
または、Linux の -D スイッチを介して Java プロセスに渡します。
-Doracle.net.tns_admin=$ORACLE_TNS_ADMIN
およびウィンドウ:として
-Doracle.net.tns_admin=%ORACLE_TNS_ADMIN%
アプリケーションが TNS 構成ファイルを認識すると、次の完全な例のように、TNSNAMES.ora ファイル内のサービス名を参照して接続できます。
// tell the driver where to look for the TNSNAMES.ORA file
System.setProperty(
"oracle.net.tns_admin",
"C:/app/product/11.2.0/client_1/NETWORK/ADMIN");
// ORCL is net service name from the TNSNAMES.ORA file
String dbURL = "jdbc:oracle:thin:@ORCL";
// load the driver
Class.forName("oracle.jdbc.OracleDriver");
Connection conn = null;
Statement stmt = null;
try {
conn = DriverManager.getConnection(dbURL,
"your_username",
"your_password");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT dummy FROM dual");