我已经在我的windows 7 64位操作系统中安装了Oracle 11g Express Edition Release 2,并试图执行JDBC程序,然后我得到了以下错误:

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
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:412)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.jlcindia.jdbc.JDBCUtil.geOracleConnection(JDBCUtil.java:28)
    at Lab3O.main(Lab3O.java:15)
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:385)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301)
    ... 8 more

当前回答

Oracle: 精简样式的服务名称语法

只有JDBC Thin驱动程序支持精简样式的服务名称。语法为:

/ service_name @ / / host_name: port_number进行

http://docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA

其他回答

我也遇到过同样的问题,通过重新启动OracleServiceXE服务解决了这个问题。转到服务。然后验证“OracleServiceXE”服务是否正常运行

有一些事情会导致这个问题,但是在开始使用JDBC之前,您需要确保可以使用SQL*Plus连接到数据库。如果你不熟悉SQL*Plus,它是一个命令行工具,用于连接Oracle数据库,很长一段时间以来一直是Oracle的标准部分,它包含在Oracle XE中。

使用JDBC连接到Oracle数据库时,不直接连接到数据库。相反,您连接到一个TNS侦听器,然后它将您连接到数据库。ORA-12505错误意味着侦听器已经启动,您可以连接到它,但它不能将您连接到数据库,因为它不知道数据库已经启动。原因有二:

数据库尚未启动, 数据库没有注册到监听器,例如,因为数据库在监听器之前启动。(当数据库启动时,如果它已经在运行,它会向侦听器注册自己。如果监听器没有运行,数据库就不会注册自己,如果监听器启动了,它也不会去寻找可能注册到它的数据库。)

ORA-12505意味着侦听器知道该数据库,但是侦听器还没有收到来自数据库的数据库启动的通知。(如果你试图连接到错误的数据库,使用错误的SID,你会得到一个ORA-12154错误“TNS:无法解析指定的连接标识符”)

服务管理单元中正在运行哪些Oracle服务?(从控制面板>管理工具>服务打开,或只需启动>运行> Services .msc。)您需要运行OracleServiceXE和OracleXETNSListener服务。

如果两个服务都已启动,您是否可以在命令提示符下使用以下任何一种方法连接到SQL*Plus中的数据库?(我假设您正在安装Oracle XE的机器上运行这些程序。)

sqlplus system/system-password@XE
sqlplus system/system-password
sqlplus / as sysdba

(“SYSTEM -password”替换为安装Oracle XE时设置的“SYS”和“SYSTEM”用户密码。)

这三种方法中的第一个通过TNS侦听器连接,但后两个不通过侦听器直接连接到数据库,并且只有当您与数据库在同一台机器上时才能工作。如果第一个失败,但其他两个成功,那么JDBC连接也将失败。如果是,使用其他两个中的一个连接到数据库,并运行ALTER SYSTEM REGISTER。然后退出SQL*Plus并再次尝试第一个表单。

如果第三个失败而第二个成功,则将您的用户帐户添加到ora_dba组中。在控制面板>计算机管理>本地用户和组中执行此操作。

一旦你可以得到连接的形式

sqlplus system/system-password@XE

为了工作,您应该能够通过JDBC连接到Oracle XE。(顺便提一下,您还没有向我们展示用于连接数据库的JDBC代码,但我怀疑它很可能是正确的;如果连接字符串的某些部分出错,就会出现各种其他错误。)

我只是错误地创建了数据库链接。

对我来说,简单的解决方法是简单地将“SID”更改为SERVICE_NAME

CREATE DATABASE LINK my_db_link
CONNECT TO myUser IDENTIFIED BY myPassword
USING
'
(
    DESCRIPTION=
    (
        ADDRESS=
        (PROTOCOL=TCP)
        (HOST=host-name-heren)
        (PORT=1521)
    )
    (CONNECT_DATA=(SID=theNameOfTheDatabase))
)';

改变

SID=theNameOfTheDatabase

to

SERVICE_NAME=theNameOfTheDatabase 

解决了我的问题。

如果您在Oracle SQL Developer中有一个工作连接,请使用连接菜单上的信息来构建您的url,如下图所示:

在上面的例子中,url将是:jdbc:oracle:thin:@ORADEV.myserver.com:1521/myservice

注意,如果您使用的是SID,那么在主机名后面有一个冒号(“:”)而不是斜杠(“/”)。

我还没有看到广泛讨论的一种可能性是,在主机上解析主机名本身可能存在问题。如果在/etc/hosts中没有$(hostname)条目,Oracle侦听器会感到困惑,不会出现。

这原来是我的问题,在/etc/hosts中添加主机名和ip地址解决了这个问题。