tnsnames.ora
文件包含Databases
及其说明(host
+ port
)。
是否可以依靠上述文件建立连接? (比如只提供数据库名称):
为了找到这个文件,我必须知道我需要在Windows注册表中查看HKEY_LOCAL_MACHINE\Software\Oracle
的默认oracle主页,然后获取所有KEY_XXX
个文件然后检查哪一个首先出现在%PATH%
上。有没有办法在客户端计算机上自动查找此文件?
答案 0 :(得分:20)
我甚至不知道使用带有瘦驱动程序的tnsnames是可能的,但显然它是在版本10中的某处添加的:
http://docs.oracle.com/cd/B19306_01/java.102/b14355/urls.htm#BEIDIJCE
特别是:
注意:
将TNSNames与JDBC Thin驱动程序一起使用时,必须将oracle.net.tns_admin属性设置为包含tnsnames.ora文件的目录。
java -Doracle.net.tns_admin=%ORACLE_HOME%\network\admin
如前所述,我还没有检查实际是否有效。
我不认为“找到实际的网络配置目录”逻辑可以通过某些Oracle功能获得。您必须按照问题中的说明手动执行此操作,或者可能依赖于存在的TNS_ADMIN环境变量。在这种情况下,java调用将是
java -Doracle.net.tns_admin=%TNS_ADMIN%
答案 1 :(得分:13)
嗯,在某些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:预言:瘦:@(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)))
请注意将double ::字符放在最后作为host:port:service,如果你将::最终放在这样:
JDBC:预言:瘦:@(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"));
或通过-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");
答案 2 :(得分:2)
首先确保在您的计算机中正确安装了SQL Developer软件。如果您使用的是瘦驱动程序,请确保您的ojdbcX.jar文件位于构建路径中。使用TNS别名来连接Oracle数据源的步骤是:
为oracle.net.tns_admin
设置系统属性。这应该指向包含tnsnames.ORA
文件
System.setProperty("oracle.net.tns_admin", DIRECTORY_PATH_TO_TNSNAME.ORA_FILE);
注册Oracle驱动程序
DriverManager.registerDriver(new OracleDriver());
创建连接对象
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:username/password@TNS_ALIAS_NAME");
这应建立数据库连接。
答案 3 :(得分:1)
从18.3开始,提供tnsnames.ora文件位置的TNS_ADMIN可以作为连接URL的一部分进行传递。请注意语法。
jdbc:oracle:thin:@jdbctest_medium?TNS_ADMIN=/test/cloud/network
答案 4 :(得分:0)
您也可以尝试以下
尝试一下,在经过数小时的故障排除后,我发现了一个经过修改的示例,它的工作方式就像是gem。
jdbc:oracle:thin:@(description=(address_list=(address=(protocol=tcp)(port=1521)(host=19.16.200.12)) (address=(protocol=tcp)(port=1521)(host=19.16.200.10)))(load_balance = yes)(connect_data=(SERVICE_NAME=stackdb)))
以下给出了无负载平衡示例:
jdbc:oracle:thin:@(description=(address_list=(address=(protocol=tcp)
(port=1521)(host=prodHost)))(connect_data=(INSTANCE_NAME=ORCL)))
以下是帮助https://docs.oracle.com/cd/E11882_01/java.112/e16548/jdbcthin.htm#JJDBC28202
的URL