好吧,在某些GUI中,TNS驱动程序配置根本没有实现或无法正常工作(例如NetBeans:-))
https://netbeans.org/bugzilla/show_bug.cgi?id=231526
这里有简单的解决方法。您可以直接从 tnsnames.ora 文件中获取该条目,并将其附加到 jdbc 驱动程序字符串,如下所示:
使用 odbc7.jar(Oracle 12c JDBC 驱动程序 for JDK 7)连接到 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=yes)(CONNECT_DATA=(SERVICE_NAME=DatabaseService))))
请注意将双精度 :: 字符放在末尾作为 host:port:service,如果您将 :: 放在最后,如下所示:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=HOSTA)(PORT= 1522))(ADDRESS=(PROTOCOL=TCP)(HOST=HOSTB)(PORT=1521)))(SOURCE_ROUTE=yes)(CONNECT_DATA=(SERVICE_NAME=DatabaseService))))::
您最终将出现“已生成 NL 异常”异常。
另一种方法是配置以下属性:System.setProperty(“oracle.net.tns_admin”,“C:/app/product/11.2.0/client_1/NETWORK/ADMIN”);
当然,例如,您可以在操作系统中设置环境变量(如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");