【问题标题】:Java JDBC - How to connect to Oracle using tnsnames.oraJava JDBC - 如何使用 tnsnames.ora 连接到 Oracle
【发布时间】:2012-12-21 02:40:33
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您可以让您的客户始终设置 TNS_ADMIN 环境变量,那么查找文件会容易得多。
  • @Chris 你能解释一下吗?
  • Oracle 客户端首先检查是否设置了 TNS_ADMIN。它必须包含包含 sqlnet.ora 和 tnsnames.ora 的目录的完整路径。只有未设置时,才会通过注册表进行搜索。

标签: java oracle jdbc


【解决方案1】:

我什至不知道可以将 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%

【讨论】:

  • windows下,将$ORACLE_HOME替换为%ORACLE_HOME%(或实际路径)
  • 注意:瘦 JDBC 驱动程序不支持 tnsnames.ora 文件中的 include 指令。
  • 这在 IntelliJ IDEA 中适用于我,但是您必须将设置添加为 VM 参数,而不是列表框中的用户定义选项。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    jdbc:oracle:thin:@jdbctest_medium?TNS_ADMIN=/test/cloud/network
    
    【解决方案4】:

    首先确保您的机器上正确安装了 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");

    这应该建立数据库连接。

    【讨论】:

      【解决方案5】:

      你也可以试试下面的

      试试这个,经过几个小时的故障排除后,我发现了一个我修改过的示例,它就像一个宝石一样工作。

      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的网址

      【讨论】:

      猜你喜欢
      • 2021-05-16
      • 2016-09-03
      • 2018-07-20
      • 2023-03-06
      • 2013-09-15
      • 1970-01-01
      • 2013-11-01
      • 2014-09-24
      • 2015-03-16
      相关资源
      最近更新 更多