繁体   English   中英

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

[英]Java JDBC - How to connect to Oracle using tnsnames.ora

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

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

  • 为了找到此文件,我必须知道默认的Oracle主目录,我需要在Windows注册表中检查HKEY_LOCAL_MACHINE\\Software\\Oracle ,然后拥有所有KEY_XXX文件,然后检查哪个文件首先出现在%PATH% 有没有一种方法可以在客户端计算机上自动找到此文件?

我什至不知道可以在瘦驱动程序中使用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%

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

请注意,如果将这样的末尾放置::,则将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 =是)(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

和Windows:按

-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(新的OracleDriver());

  • 创建一个连接对象

    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:username/password@TNS_ALIAS_NAME");

这应该建立数据库连接。

从18.3开始,提供tnsnames.ora文件位置的TNS_ADMIN可以作为连接URL的一部分传递。 请注意语法。

jdbc:oracle:thin:@jdbctest_medium?TNS_ADMIN=/test/cloud/network

您也可以尝试以下

在经过数小时的故障排除后,遇到了一个我修改过的示例,它的工作原理就像是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM