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

2022-09-02 02:39:54

tnsnames.ora文件包含 及其说明 ( + )。Databaseshostport

  • 是否可以根据上述文件建立连接?(通过仅提供数据库名称来表示):

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


答案 1

我甚至不知道将tnsnames与精简驱动程序一起使用是可能的,但显然它是在版本10中的某个地方添加的:

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

特别:

注意:

将 TNSNames 与 JDBC 精简驱动程序一起使用时,必须将 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%

答案 2

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

推荐