【问题标题】:JDBC remote Oracle connection without listener (TNSNAMES.ora)没有侦听器的 JDBC 远程 Oracle 连接 (TNSNAMES.ora)
【发布时间】:2018-07-20 20:31:10
【问题描述】:

我正在尝试使用 ojdbc6.jar 连接到远程 Oracle DB。 JDK 1.8、Oracle 11g。

监听器不工作!:

C:\Users\user>lsnrctl services

LSNRCTL for 64-bit Windows: Version 12.1.0.2.0 - Production on 09-FEB-2018 
20:20:37

Copyright (c) 1991, 2014, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
64-bit Windows Error: 61: Unknown error

有没有办法在不使用 TNSNAMES.ora 中的任何记录的情况下进行连接?

我尝试了多种选择,但都没有奏效。

选项 #1:

("jdbc:oracle:thin:scott/tiger@//server_address:1521/SERVICE_NAME");

(scott = 用户名,tiger = 密码)

地点:

  • server_address 为 ip,如 169.xx.xx.xxx

  • SERVICE_NAME 源自:

    SELECT sys_context('USERENV', 'SERVICE_NAME') FROM DUAL;
    

选项 #2:

("jdbc:oracle:thin:scott/tiger@//SERVER_HOST:1521/SERVICE_NAME")

在哪里: - SERVER_HOST 源自:

 SELECT sys_context('USERENV', 'SERVER_HOST') FROM DUAL;

选项 #3:

("jdbc:oracle:thin:scott/tiger@//server_address:1521:SID");

其中 SID 来自:

SELECT sys_context('USERENV', 'SID') FROM DUAL;

选项 #4:

与 #1、#2 或 #3 相同,但在 server_address 或 SERVER_HOST 之前没有“//”。

我尝试了更多组合,混合 server_address、SERVER_HOST 和 SID,但无济于事。我总是遇到同样的错误:

java.sql.SQLException: Listener refused the connection with the following 
error:
*ORA-12514, TNS:listener does not currently know of service requested in 
connect descriptor*

at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
at 
oracle.jdbc.driver.T4CDriverExtension.getConnection 
(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at testutil.OracleConnection.main(OracleConnection.java:55)
Caused by: oracle.net.ns.NetException: Listener refused the connection with 
the following error:
ORA-12514, TNS:listener does not currently know of service requested in 
connect descriptor

at oracle.net.ns.NSProtocol.connect(NSProtocol.java:399)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1140)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:340)
... 7 more

如果不涉及 TNSNAMES,我认为我使用了正确的语法。据我研究,如果我在 TNSNAMES 中有条目,则语法如下:

("jdbc:oracle:thin:@host_address:1521:xe","scott", "tiger");

但是,不幸的是,我没有 \network\admin\sample 的管理员权限,所以在我的情况下它不是一个选项。

【问题讨论】:

  • 没有权利就不能。
  • @RomanC 你是说我不能避免使用 TNSNAMES.ora 来连接吗?
  • 顺序很重要。
  • 如果不清楚,tnsnames.ora 是完整的 Oracle 客户端用来将主机/端口/服务详细信息与标签相关联的本地文件。通常 JDBC 瘦客户端不使用它(尽管现在我检查了,it appears that it can)。 (其他命名方法可用。)这些详细信息应与数据库服务器上lsnrctl services 报告的服务之一匹配。
  • 例如,您可能有一个 tnsnames 条目 KITTENS 定义为 host=svalbardprod42, port=1521, service=kittentracking_app。然后,当您以user/pass@KITTENS 连接时,Oracle 客户端会尝试联系svalbardprod42:1521 的侦听器并请求连接到服务kittentracking_app。 (JDBC 瘦客户端的工作方式相同,但没有方便的可配置标签。)您应该能够确认其中的每一项(主机存在,侦听器正在运行并在该端口上侦听,服务在服务列表中。)

标签: java oracle jdbc oracle11g


【解决方案1】:

您的选项都是正确的,但监听器必须正常工作。如果侦听器无法正常工作,唯一的连接方法是在盒子上使用 bequeath,jdbc url 看起来像这样

// the url for bequeath connection
String url = "jdbc:oracle:oci8:@";
ods.setURL(url);

【讨论】:

    【解决方案2】:

    使用 JDBC 瘦驱动程序(JDBC URL 以 jdbc:oracle:thin 开头)进行远程连接的唯一方法是通过 tcp 或 tcps,这两者都需要启动并运行和注册的侦听器。让监听器运行后,您可以尝试您在问题中提到的 URL。如果您想使用应用程序连续性或 RAC 等高级选项,我建议您使用服务名称而不是 SID。

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 2010-10-23
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 2017-01-21
      相关资源
      最近更新 更多