Java JDBC – 如何使用tnsnames.ora连接到Oracle

tnsnames.ora文件包含Databases及其描述( host + port )。

  • 是否可以依赖上述文件建立连接? (假设仅提供数据库名称):

  • 为了找到这个文件,我必须知道默认的oracle home我需要在Windows注册表中检查HKEY_LOCAL_MACHINE\Software\Oracle ,然后获取所有KEY_XXX文件,然后检查哪一个首先出现在%PATH% 。 有没有办法在客户端计算机上自动查找此文件?

我甚至不知道使用带有瘦驱动程序的tnsnames是可能的,但显然它是在版本10中添加的:

http://docs.oracle.com/cd/B19306_01/java.102/b14355/urls.htm#BEIDIJCE

尤其是:

 Note: When using TNSNames with the JDBC Thin driver, you must set the oracle.net.tns_admin property to the directory that contains your tnsnames.ora file. java -Doracle.net.tns_admin=%ORACLE_HOME%\network\admin 

如上所述,我没有检查这是否真的有效。

我不认为通过某些Oraclefunction可以找到“找到实际的网络配置目录”逻辑。 您必须按照问题中的说明手动执行此操作,或者可能依赖于存在的TNS_ADMIN环境变量。 在这种情况下,java调用将是

 java -Doracle.net.tns_admin=%TNS_ADMIN% 

好吧,在某些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)))

请注意最后将double ::字符作为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)))::

您将最终得到“生成NLexception”exception。

另一种方法是配置以下属性: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 

和窗户: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"); 

首先确保在您的计算机中正确安装了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");

这应该建立数据库连接。