嗯,在某些 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=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 Exception was generated”异常。
另一种方法是配置以下属性:
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"));
或通过 -D 开关将其传递给 java 进程
在 Linux 上:
-Doracle.net.tns_admin=$ORACLE_TNS_ADMIN
和windows:as
-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");