没有监听器的JDBC远程Oracle连接(TNSNAMES.ora)

时间:2018-02-10 02:02:40

标签: java oracle jdbc oracle11g

我正在尝试使用ojdbc6.jar连接到远程Oracle数据库。 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 = username,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的管理员权限,所以在我的情况下它不是一个选项。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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