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

Posted

技术标签:

【中文标题】如何使用带有 TNSNames 别名语法的 JDBC 瘦驱动程序连接到 Oracle 数据库【英文标题】:How to connect to the Oracle database using JDBC thin driver with TNSNames Alias Syntax 【发布时间】:2013-01-09 05:30:46 【问题描述】:

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

jdbc:oracle:thin:@abcd

在我的 tnsnames.ora 文件中定义了“abcd”,如下所示:

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

我已经按照Oracle® Database JDBC Developer's Guide and Reference 提供了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.0_31。

谢谢, 主播

【问题讨论】:

oracle.net.tns_admin 应该指向一个目录而不是一个文件。所以应该是-Doracle.net.tns_admin=/etc。另请注意,数据库集群可能有多个主机名,外加许多 DBA 可能想要设置的连接参数。 tnsnames.ora 确实应该是首选方式。 JDBC url 太“愚蠢”了。 【参考方案1】:

看起来,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)
    )
  )

【讨论】:

【参考方案2】:

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

    下载并解压flyway

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

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

    将 flyway 文件夹(您可以在其中找到 flyway cli 脚本)放在路径中(es:在 linux 上 export PATH=/home/matteo/opt/flyway

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

    注意:linux的flyway脚本在以下行中有一个错误 JAVA_ARGS="-Djava.security.egd=file:/dev/../dev/urandom $JAVA_ARGS" 你需要附加 $JAVA_ARGS 以不被覆盖

    在您的项目文件夹中编辑一个您希望命名的文件,例如 flyway.conf

    使用此命令测试飞行路径

    flyway -configFile=flyway.conf 信息

我收到这个输出

Boxfuse 的 Flyway 4.0.3

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

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

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

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

|未找到迁移 |

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

【讨论】:

【参考方案3】:

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

如果您使用如下连接 URL,则不需要 oracle 客户端:

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

【讨论】:

你是对的。我更喜欢同样的。 oracle 客户端安装在每个环境中。我们被要求不要依赖主机名和端口号,因为这些可以随时更改,也可以在不同环境之间变化。并且还要尽量减少必须更改设置的地方的数量。用其他语言编写的应用程序似乎对这种设置没有任何问题。 如果您仍想使用 TNS,我建议您使用以下链接:***.com/questions/4832056/…。但是主机和端口不应随时间随机变化。它们应该是每个环境的马厩。您必须做的一件事是将应用程序中的 url 外部化,以便可以为每个环境设置它。 这个链接其实更好:razorsql.com/articles/oracle_jdbc_connect.html 感谢汤姆的链接。 url 已经外部化,我们现在使用jdbc:oracle:thin:@//host:port/service_name 格式。猜想当有多个别名时,我们无法使用 Oracle JDBC 驱动程序来使用 tnsnames.ora 中的 TNS 名称。

以上是关于如何使用带有 TNSNames 别名语法的 JDBC 瘦驱动程序连接到 Oracle 数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 jdb 调试 Java servlet。如何将 jdb 与 Tomcat 连接

如何使用带有实体框架 6 的 TNS 别名连接到 Oracle DB?

Sql Server:如何使用别名取消透视?

plsql如何连接本地数据库

如何读取现有的 jdb 文件 java berkeley db

linux 如何删除命令别名