2016-02-03 184 views
0

我正在查看使用JDBC連接來連接到Oracle 11g數據庫(11.2.0)的Web應用程序。該應用程序不工作了一段時間的任何問題(約一小時),然後我得到:ORA-12505,TNS:監聽器當前不知道Tomcat應用程序中的連接描述符中給出的SID

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」。

我想知道爲什麼我在一段時間後得到這個異常以及如何解決這個問題。如果沒有,我怎樣才能避免重新啓動我的機器?謝謝。

回答

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:預言:瘦:@(DESCRIPTION = (ADDRESS =(PROTOCOL = TCP)(HOST =爲myhost-VIP)(PORT = 1521)) (CONNECT_DATA =(SERVICE_NAME = myorcldbservicename)))

另外,要驗證連接URL是否正確形成,請使用以下方法從SQL開發人員處獲得連接並進行測試。

SQLPLUS小時/小時@ 「(DESCRIPTION = (ADDRESS =(PROTOCOL = TCP)(HOST =爲myhost-VIP)(PORT = 1521)) (CONNECT_DATA =(SERVICE_NAME = myorcldbservicename)))」

相關問題