Java Oracle本地主机连接错误(ORA-12505)

3

我目前正在尝试连接我的电脑上的一个数据库。

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

public class Main {
    public static void main(String[] argv) throws Exception {

        Connection connection = null;
        try {
            // Load the JDBC driver
            String driverName = "oracle.jdbc.driver.OracleDriver";
            Class.forName(driverName);

            // Create a connection to the database
            String serverName = "localhost";
            String portNumber = "1521";
            String sid = "xe";
            String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
            String username = "scott";
            String password = "tiger";
            connection = DriverManager.getConnection(url, username, password);
            System.out.println("Success");
        } catch (ClassNotFoundException e) {
            System.out.println("Class Not Found Error");
        } 
    }
}

我一直收到这个错误,但不知道为什么...

Exception in thread "main" java.sql.SQLException: Listener refused the connection 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:xe

at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:110)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:171)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:496)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:465)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at Main.main(Main.java:21)

在我的服务器中,我使用了以下命令(作为sys用户登录):

SQL> select instance from v$thread;

它返回:

Instance--> xe

我可能做错了什么?

谢谢!

P.S. 我也尝试过使用127.0.0.1而不是localhost。


当使用拥有数据库的用户运行lsnrctl status时,会显示什么? - Mat
你是在使用Oracle Express Edition (XE)还是标准版/企业版? - Vineet Reynolds
@Vineet:SID“xe”表示他正在使用Express版本。 - Luke Woodward
@Luke,不用了。根据他之前的问题,他正在运行一个示例,所以xe SID可能是他复制的示例中的。 - Vineet Reynolds
我正在使用10g Express Edition,XE是默认安装的,我只是使用了它。 - k9b
显示剩余2条评论
5个回答

4

检查位于<ORACLE_HOME>\admin\NETWORK目录下的listener.ora文件是否具有以下值:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

1
我没有那个,但我有 `LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) (ADDRESS = (PROTOCOL = TCP)(HOST = LENOVO-E04EFE5E)(PORT = 1522)) ) )DEFAULT_SERVICE_LISTENER = (XE)` - k9b
谢谢,我遇到了一个问题,端口不是1521而是1522,现在它可以工作了。谢谢! - k9b
@k9b 我也是!那解决方案是什么呢? - Satej
看起来我的端口关闭了(1522而不是1521)@Satej - 这个问题很旧,抱歉我记不清楚了。 - k9b

4

使用以下代码替换原有代码:

String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + "/" + sid;

这样会更好一些。

注意不要删除任何HTML标签。


2

用你在安装过程中设置的数据库名称替换xe,你肯定会成功。

如果你忘记了dbname,可以从你的Oracle目录中的tnsnames.ora文件中检索到它。


1
我在连接Oracle RAC时遇到了同样的问题。我将URL从port:servicename更改为port/servicename,这对我起作用了。

0

我猜测TNS监听器已经启动,但是数据库实例在监听器之前启动了。

当数据库实例启动时,它会向TNS监听器注册自己。然而,如果没有监听器可以注册,它就无法这样做。当监听器启动时,它不会检查它所知道的实例是否已经启动。

我可以提供一个演示。我正在使用Windows 7上的Oracle 11g XE Beta。最初,OracleServiceXE服务正在运行,但OracleXETNSListener服务没有运行。

我运行了你的数据库连接代码,然后我得到了以下错误:

Exception in thread "main" java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection

如果你遇到ORA-12505错误,那么显然你的TNS监听器正在运行。

然后我启动了TNS监听器并重新运行了你的数据库连接代码。这次我得到了以下输出:(我已经重命名了你的类并在其中更改了用户名和密码,但除此之外,其中的代码是相同的):

C:\Users\Luke\stuff>java DbConnTest
线程“main”中的异常 java.sql.SQLException: 监听程序拒绝了连接并显示以下错误:
ORA-12505,TNS:监听程序当前不知道在连接描述符中给定的SID
[堆栈跟踪已剪切]

(此错误与您的错误不完全相同:我没有得到其中的The Connection descriptor used by the client was:部分。我不确定原因是什么。)

在上面的情况下,解决方法是作为SYS连接到SQL*Plus并运行ALTER SYSTEM REGISTER。这将向侦听器注册实例:

C:\Users\Luke\stuff>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.2.0 Beta on Sun Jul 24 11:13:57 2011
版权所有(c) 1982, 2010, Oracle。保留所有权利。
已连接到: Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta
SQL> alter system register;
系统已更改。
SQL> exit 已断开与 Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta 的连接
在执行这个操作后,我成功连接到了数据库:
C:\Users\Luke\stuff>java DbConnTest
连接成功

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接