Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC-如何使用tnsnames.ora连接到Oracle_Java_Oracle_Jdbc - Fatal编程技术网

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

Java JDBC-如何使用tnsnames.ora连接到Oracle,java,oracle,jdbc,Java,Oracle,Jdbc,tnsnames.ora文件包含数据库及其描述(主机+端口) 是否可以依赖上述文件建立连接?(仅提供DB名称): 为了找到此文件,我必须知道默认的oracle主页,我需要在windows注册表中检查HKEY\U LOCAL\U MACHINE\Software\oracle,然后获取所有键XXX文件,然后检查哪个文件首先出现在%PATH%上。有没有办法在客户端计算机上自动查找此文件 我甚至不知道将tnsnames与瘦驱动程序一起使用是可能的,但很明显,它是在版本10中添加的: 特别是: 注:

tnsnames.ora
文件包含
数据库及其描述(
主机
+
端口

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

  • 为了找到此文件,我必须知道默认的oracle主页,我需要在windows注册表中检查
    HKEY\U LOCAL\U MACHINE\Software\oracle
    ,然后获取所有
    键XXX
    文件,然后检查哪个文件首先出现在
    %PATH%
    上。有没有办法在客户端计算机上自动查找此文件


我甚至不知道将tnsnames与瘦驱动程序一起使用是可能的,但很明显,它是在版本10中添加的:

特别是:

注:

在JDBC精简驱动程序中使用TNSNames时,必须将oracle.net.tns_admin属性设置为包含TNSNames.ora文件的目录

java-Doracle.net.tns\u admin=%ORACLE\u HOME%\network\admin

如前所述,我还没有检查这是否真的有效

我不认为“查找实际网络配置目录”逻辑可以通过一些Oracle函数使用。您必须按照问题中所述手动执行,或者可能依赖于存在的TNS_ADMIN环境变量。在这种情况下,java调用将是

java -Doracle.net.tns_admin=%TNS_ADMIN%

嗯,在某些GUI中,TNS驱动程序配置根本没有实现或不起作用(例如NetBeans:-)

这里有一个简单的解决方法。您可以直接从tnsnames.ora文件获取条目,并将其附加到jdbc驱动程序字符串,如下所示:

使用odbc7.jar(适用于JDK 7的Oracle 12c JDBC驱动程序)到 连接到Oracle 11gR2 RAC群集:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL))= TCP)(主机=主机A)(端口= (地址=(协议=TCP)(主机=主机B)(端口=1521))(源\路由=是)(连接\数据=(服务\名称=数据库服务)))

请注意将double::字符作为host:port:service放在末尾,如果您将这样放在末尾:::

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL))= TCP)(主机=主机A)(端口= 1522))(地址=(协议=TCP)(主机=主机B)(端口=1521))(源\路由=是)(连接\数据=(服务\名称=数据库服务))::

您将以“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");

首先,确保SQL Developer软件已正确安装在您的计算机中。如果您使用的是精简驱动程序,请确保ojdbcX.jar文件位于构建路径中。使用TNS别名连接到Oracle数据源的步骤如下:

  • 为oracle.net.tns\u admin设置系统属性。这应该指向包含
    tnsnames.ORA
    文件的目录

    System.setProperty(“oracle.net.tns\u admin”,目录\u路径\u到\u TNSNAME.ORA\u文件)

  • 注册Oracle驱动程序

    registerDriver(新的OracleDriver())

  • 创建一个连接对象

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


这将建立数据库连接。

您也可以尝试以下操作

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

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)))

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

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

如果您可以让您的客户端始终设置TNS_ADMIN环境变量,这将使查找文件变得更容易。@Chris,您能详细解释一下吗?Oracle客户端首先检查是否设置了TNS_ADMIN。它必须包含包含sqlnet.ora和tnsnames.ora的目录的完整路径。只有未设置时,才会通过注册表进行搜索。在windows下,将
$ORACLE\u HOME
替换为
%ORACLE\u HOME%
(或实际路径)注意:精简JDBC 驱动程序不支持tnsnames.ora文件中的
include
指令。这在IntelliJ IDEA中对我适用,但是您必须将设置添加为VM参数,而不是列表框中的用户定义选项。这看起来像是重复的答案,您几分钟前已经回答过了