2015-06-16 53 views
2

我正在使用Oracle 12C作为我的数据库。 我已经用Java编写了一个小型的JDBC连接程序,但是我面临着一个监听器的问题。ORA-12505:TNS监听器当前不知道连接描述符中给出的SID

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

public class JdbcConnection { 
    public static void main(String[] args) throws SQLException,ClassNotFoundException { 
     String url = "jdbc:oracle:thin:@localhost:1521:orcl"; 
     String user = "system"; 
     String password = "password"; 
     Connection connection = null; 

     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     connection = DriverManager.getConnection(url, user, password); 
     if(connection!=null){ 
      System.out.println("Success in connnection"); 
     } else { 
      System.out.println("failure in connection "); 
     } 
    } 
} 

我得到以下异常:

C:\Users\Administrator\Desktop>java JdbcConnection 
Exception in thread "main" java.sql.SQLException: Listener refused the connectio 
n with the following error: 
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 
The Connection descriptor used by the client was: 
localhost:1521:orcl 

     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java 
:112) 
     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java 
:261) 
     at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387) 
     at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java: 
441) 
     at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165) 
     at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtensio 
n.java:35) 
     at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801) 
     at java.sql.DriverManager.getConnection(Unknown Source) 
     at java.sql.DriverManager.getConnection(Unknown Source) 
     at JdbcConnection.main(JdbcConnection.java:18) 

这是lsnrctl status

LSNRCTL for 64-bit Windows: Version 12.1.0.1.0 - Production on 16-JUN-2015 13:43 
:41 

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

Welcome to LSNRCTL, type "help" for information. 

LSNRCTL> status 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) 
STATUS of the LISTENER 
------------------------ 
Alias      LISTENER 
Version     TNSLSNR for 64-bit Windows: Version 12.1.0.1.0 - Produ 
ction 
Start Date    16-JUN-2015 12:02:52 
Uptime     0 days 1 hr. 40 min. 52 sec 
Trace Level    off 
Security     ON: Local OS Authentication 
SNMP      OFF 
Listener Parameter File C:\app\orauser\product\12.1.0\dbhome_1\network\admin\l 
istener.ora 
Listener Log File   C:\app\orauser\diag\tnslsnr\hydwemvm\listener\alert\lo 
g.xml 
Listening Endpoints Summary... 
    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc))) 
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hydwemvm)(PORT=1521))) 
Services Summary... 
Service "CLRExtProc" has 1 instance(s). 
    Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service... 
The command completed successfully 
+0

你能告诉我们代码吗? – Kryptos

+0

您是否为计算机上的Oracle和侦听器启动了Windows服务? –

+0

是的,服务正在运行,我也重新启动了服务。 –

回答

10

如果你知道你的Oracle数据库SID输出,然后用

jdbc:oracle:thin:@localhost:1521:orcl 

otherwi参见下面的使用情况下,你有服务名称

jdbc:oracle:thin:@localhost:1521/orcl 

此外,确保服务名称与名称ORCL应该是启动和运行。如果仍然无法工作,那么您需要重新启动机器,然后重试。

还在,无法正常工作?然后,尝试以下操作:

登录与用户SYSTEM通过以下SQLS运行注册LOCAL_LISTENER

alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope = both; 
alter system register; 

如何检查Oracle SID和服务名称:

SELECT sys_context('USERENV', 'SID') FROM DUAL; -- It will return your oracle database SID 

SELECT sys_context('USERENV', 'SERVICE_NAME') FROM DUAL; -- It will return your oracle database service name 
+0

我已经尝试了上述两种格式仍然没有运气 –

+0

然后,如我所说,重新启动您的机器,并尝试。 – Ravi

1

如果你想知道你的数据库的默认SID在sqlplus使用此查询:

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

在JDBC URL中使用此值而不是“orcl”。

1

你可以使用下面的URL吗?
注意不同之处,这是使用SERVICENAME而不是SID。

jdbc:oracle:thin:@localhost:1521/orclservice 
相关问题