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; (它返回)实例-> xe

我可能做错了什么?

谢谢!

PS我也试过 127.0.0.1 而不是 localhost

4

5 回答 5

4

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

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )
于 2011-07-24T08:26:35.113 回答
4

而不是 String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;

用这个:

字符串 url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + "/" + sid;

于 2014-06-05T19:40:23.303 回答
2

将 xe 替换为您在安装过程中设置的数据库名称,您一定会成功

如果您忘记了 dbname,可以从 oracle 目录中的文件 tnsnames.ora 中检索它

于 2013-08-26T12:35:14.857 回答
1

我在连接到 oracle rac 时遇到了同样的问题。我将网址从port:servicenameto更改port/servicename为对我有用。

于 2014-07-25T17:13:30.690 回答
0

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

当数据库实例启动时,它会向 TNS 监听器注册自己。但是,如果没有要注册的侦听器,则无法执行此操作。当侦听器启动时,它不会检查它所知道的实例是否已启动。

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

我运行了您的数据库连接代码,但出现以下错误:

线程“主”java.sql.SQLRecoverableException 中的异常:IO 错误:网络适配器无法建立连接

如果您收到 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:部分。我不是 100% 确定为什么。)

在上述情况下,修复方法是连接到 SQL*PlusSYS并运行ALTER SYSTEM REGISTER. 这将向侦听器注册实例:

C:\Users\Luke\stuff>sqlplus / as sysdba

SQL*Plus:2011 年 7 月 24 日星期日 11:13:57 发布 11.2.0.2.0 Beta

版权所有 (c) 1982, 2010, Oracle。版权所有。


连接到:
Oracle Database 11g Express Edition 发行版 11.2.0.2.0 - Beta

SQL> 改变系统注册;

系统变了。

SQL>退出
从 Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta 断开连接

完成此操作后,我能够连接到数据库:

C:\Users\Luke\stuff>java DbConnTest
成功
于 2011-07-24T10:42:59.603 回答