0

我正在查看一个使用 JDBC Connection 连接到 Oracle 11g 数据库 (11.2.0) 的 Web 应用程序。该应用程序可以正常工作一段时间(大约一个小时),然后我得到:

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

我尝试重新启动 Oracle 和 Oracle 服务 OracleServiceXE 和 OracleXETNSListener 但错误不会消失。只有在我重新启动机器后它才会消失。

我没有更改 Tomcat 或 Oracle 中的任何数据库参数。

这是我的 tnsnames.ora

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

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

ORACLR_CONNECTION_DATA = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) 
    ) 
    (CONNECT_DATA = 
      (SID = CLRExtProc) 
      (PRESENTATION = RO) 
    ) 
  ) 

这是我对 JDBC 的配置:

    String serverName = "localhost";
    String portNumber = "1521";
    String sid = "xe";
    String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
    String username = "xxx";
    String password = "yyy";

当“XE”正常工作时,如果我检查 lsnrctl 状态,我可以看到

Service "XEXDB" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
Service "xe" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
The command completed successfully

一旦我得到异常,当我检查 lsnrctl 状态时,我看不到实例“xe”。

我想知道为什么我会在一段时间后得到这个异常以及如何解决这个问题。如果没有,我怎样才能在不重新启动机器的情况下绕过它?谢谢。

4

1 回答 1

0

数据库 URL 应如下所示。

// Create DataSource and connect to the local database
ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:@//localhost:5221/orcl");
ods.setUser("HR");
ods.setPassword("hr");
conn = ods.getConnection();

建议使用长格式的连接 URL,如此处所示。jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=myhost-vip)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=myorcldbservicename)))

此外,要验证连接 URL 的格式是否正确,请使用以下方法从 SQL 开发人员处获取连接并进行测试。

sqlplus hr/hr@"(DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=myhost-vip)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=myorcldbservicename)))"

于 2016-02-04T18:43:09.913 回答