【发布时间】: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