2014-03-06 49 views
1

嘗試通過Java連接到Oracle數據庫時,我隨機出現「IO錯誤:網絡適配器無法建立連接」。有時我必須在停止拋出錯誤之前運行我的應用程序幾次。隨機獲取「IO錯誤:網絡適配器無法建立連接」

// initializes database connection 
private static Connection initializeDatabaseConnection(Properties prop) { 

    System.setProperty("oracle.net.tns_admin", prop.getProperty("tnsLocation")); 

    try { 
     Class.forName("oracle.jdbc.OracleDriver"); 
    } 
    catch (ClassNotFoundException ex) 
    { 
     System.out.println(ex.getMessage()); 
    } 

    String dbURL = "jdbc:oracle:thin:@" + prop.getProperty("serviceName"); 
    String username = prop.getProperty("username"); 
    String password = prop.getProperty("password"); 

    Connection conn = null; 

    try { 
     conn = DriverManager.getConnection(dbURL, username, password); 
    } 
    catch (SQLException ex) 
    { 
     System.out.println("Error initializing database connection. " + ex.getMessage()); 
     System.exit(1); 
    } 

    return conn; 
} 

任何想法爲什麼它會隨機拋出錯誤?我正在使用JDK 1.7和ojdbc6.jar驅動程序。

+0

噢,我正在使用tnsnames.ora文件。 – farbodg

+0

聽起來像是一個網絡問題 - 也許路由器或類似的東西壞了。 –

回答

2

下載PingPlotter並將其打開(讓它運行24小時左右)。觀看歷史圖表,當您的應用程序無法連接到Oracle時,您可能會發現IP地址丟失或響應時間過長。您沒有邏輯錯誤,無論是服務器嚴重超載,還是您與它之間都出現嚴重擁塞。你是通過VPN連接嗎?

http://www.pingplotter.com/

或者只是在連續模式下使用Ping命令行一個小時左右:

ping -t <IP address or hostname> 

坪繪圖儀也無法ping經常和它創造好的圖表。

如果您正在遠程工作,那麼它可能是您的ISP。否則,請與網絡管理員或DBA交談。

很明顯,您無法使用數據庫連接進行生產,因此希望您只能從您的開發環境中看到此問題。嘗試部署到計劃最終運行應用程序的計算機,並查看它是否得到改進。

如果沒有什麼可以做的更好,我建議增加JDBC驅動程序的初始登錄超時。

谷歌JDBC setLoginTimeout

下面是一個例子,雖然有幾種方法去了解它,這取決於你的驅動程序。

Connection timeout for DriverManager getConnection

+0

感謝您的幫助。我找出了問題所在。在與我的同事交談後,我被告知由於RAC的工作方式,這個問題很常見。我正在連接到Oracle RAC羣集,並且在我要連接的服務名稱下有三個主機。當我初始化連接時,負載均衡器會返回我將用於連接的數據庫服務器的機器名稱(而非IP地址)。所以當我的機器嘗試解析服務器的機器名稱時,它會失敗。修復方法是在主機文件中放入一個條目。這樣做後,我的失敗就停止了。 – farbodg

+0

當然。我熟悉RAC。一旦你的客戶端機器配置成功,RAC負載平衡應該對你的JDBC客戶端透明(這聽起來像你發現的)。您是否將條目放入所有RAC節點(vips)的主機文件中? – codenheim

+0

是的,我必須將所有三臺機器放在我的hosts文件中。 – farbodg

相關問題