Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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 如何使用带有TNSNames别名语法的JDBC精简驱动程序连接到Oracle数据库_Java_Jdbc - Fatal编程技术网

Java 如何使用带有TNSNames别名语法的JDBC精简驱动程序连接到Oracle数据库

Java 如何使用带有TNSNames别名语法的JDBC精简驱动程序连接到Oracle数据库,java,jdbc,Java,Jdbc,我正在尝试使用Oracle JDBC精简驱动程序(11.2.0.2.0的ojdbc6.jar)和以下JDBC URL语法连接到Oracle(11.2.0.2.0)数据库: jdbc:oracle:thin:@abcd 其中“abcd”在我的tnsnames.ora文件中定义,如下所示: abcd, abcd.world, abcd.dk.xyz.com = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = abcd.dk.

我正在尝试使用Oracle JDBC精简驱动程序(11.2.0.2.0的ojdbc6.jar)和以下JDBC URL语法连接到Oracle(11.2.0.2.0)数据库:

jdbc:oracle:thin:@abcd
其中“abcd”在我的tnsnames.ora文件中定义,如下所示:

    abcd, abcd.world, abcd.dk.xyz.com  =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = abcd.dk.xyz.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = abcd)
    )
  )
我已经按照提供了VM选项
-Doracle.net.tns_admin=/etc/tnsnames.ora

运行应用程序时,我遇到以下错误:

    Listener refused the connection with the following error:
ORA-12504, TNS:listener was not given the SID in CONNECT_DATA
但是,当我从tnsnames.ora中删除别名abcd.world和abcd.dk.xyz.com时,我的应用程序就能够连接到数据库

当tnsnames.ora文件中有多个别名时,ojdbc驱动程序是否存在问题

我的JDK版本是1.6.031

谢谢,
VJ

理想情况下,您不应该通过TNS进行连接,因为您需要在计算机上安装oracle客户端

如果使用如下所示的连接url,则不需要oracle客户端:

jdbc:oracle:thin:@//host:port/service_name

看起来,Oracle JDBC驱动程序无法与多个服务名称一起工作。 使用这些条目

    abcd =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = abcd.dk.xyz.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = abcd)
    )
  )
    abcd.world, abcd.dk.xyz.com  =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = abcd.dk.xyz.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = abcd)
    )
  )

我可以通过以下方式通过tnsnames.ora成功连接到oracle

  • 下载并解压缩flyway

  • 从oracle站点下载最新的ojdbcX.jar

  • 将驱动程序目录中的文件放入flyway文件夹

  • 将flyway文件夹(您可以在其中找到flyway cli脚本)放在路径(es:on-linux导出路径=/home/matteo/opt/flyway)中

  • 编辑flyway二进制文件/home/matteo/opt/flyway/flyway放入JAVA_ARGS=“-Doracle.net.tns_admin=”指向包含tnsnames.ora的文件夹

  • 注意:linux的flyway脚本在以下行中有一个bug JAVA_ARGS=“-Djava.security.egd=file:/dev/。/dev/uradom$JAVA_ARGS”您需要附加$JAVA_ARGS以避免被覆盖

  • 编辑项目文件夹中名为所需名称的文件,例如flyway.conf

  • 使用此命令测试flyway

    flyway-configFile=flyway.conf信息

  • 我收到这个输出

    通过Boxfuse的Flyway 4.0.3

    数据库:jdbc:oracle:thin:@PSR.LAB_CERT(oracle 11.2)

    +---------+-------------+---------------------+---------+

    |版本|说明|安装在|状态|

    +---------+-------------+---------------------+---------+

    |未找到任何迁移|

    +---------+-------------+---------------------+---------+


    你说得对。我也希望如此。oracle客户端安装在每个环境中。我们被要求不要依赖主机名和端口号,因为它们可以随时更改,也可以在不同的环境中更改。此外,还要尽量减少必须更改设置的位置。应用程序使用其他语言编写此设置似乎没有问题。如果您仍要使用TNS,我建议使用以下链接:。但主机和端口不应随时间随机更改。它们应该是每个环境的稳定设置。您必须做的一件事是从应用程序外部化url,以便可以为每个环境设置。此链接实际上更好:Thanks用于链接Tom。url已经外部化了,我们现在使用的是
    jdbc:oracle:thin:@//host:port/service\u name
    格式。我猜当存在多个别名时,我们无法使用oracle jdbc驱动程序从tnsnames.ora使用TNS name。oracle.net.TNS\u admin应该指向一个目录,而不是一个文件。因此它应该是
    -Doracle.net.tns_admin=/etc
    。还要注意,数据库集群可能有多个主机名,而且DBA可能需要设置几十个连接参数。确实应该优先选择tnsnames.ora。JDBC URL太“愚蠢”。