【问题标题】:ORA-12505 :TNS listener does not currently know of SID given in connect descriptorORA-12505:TNS 侦听器当前不知道连接描述符中给出的 SID
【发布时间】:2015-08-31 21:16:59
【问题描述】:

我正在使用 Oracle 数据库。我用 Java 编写了一个小型 JDBC 连接程序,但我遇到了侦听器的问题。

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

【问题讨论】:

  • 你能给我们看看代码吗?
  • 您是否在您的计算机上为 Oracle 和侦听器启动了 Windows 服务?
  • 是的,服务正在运行,我也正在重新启动服务。
  • 能否将lsnrctl status 的输出添加到您的问题中?
  • 您可以使用sqlplus system/password@orcl 进行连接吗?顺便说一句:您应该永远system 帐户用于应用程序内容。创建一个普通用户并使用它。 systemsys 帐户应用于管理数据库。永远不要与这些用户一起创建自己的对象。

标签: java oracle jdbc listener tns


【解决方案1】:

如果您知道您的 oracle 数据库 SID,请使用

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

如果您有服务名称,请在下面使用

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

此外,请确保名称为 ORCL 的服务名称应该已启动并正在运行。如果仍然不起作用,那么您需要重新启动机器并在上面重试。

还是不行?然后,尝试以下操作:

使用SYSTEM 用户登录并通过运行以下SQL 注册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

【讨论】:

  • 以上两种格式我都试过了,还是不行
  • 然后,正如我所提到的,重新启动您的机器并尝试。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    您可以使用以下网址吗?
    注意区别,这是使用 SERVICENAME 而不是 SID。

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

    【讨论】:

      【解决方案4】:

      我也面临同样的问题。

      尝试拔下 LAN 电缆或断开网络连接,然后 重启Listener的服务并运行代码。

      它对我有用。

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 2017-08-22
        • 2014-04-21
        • 2014-11-21
        • 2014-01-07
        • 2017-05-10
        相关资源
        最近更新 更多