0

JDBC 接続を使用して Oracle 11g データベース (11.2.0) に接続する Web アプリケーションを見ています。アプリケーションはしばらくの間 (約 1 時間) 問題なく動作し、次のようになります。

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 に答える