2013-07-09 83 views
0

我在我的J2ee應用程序中遇到了StaleConnectionException。我研究過(和搜索過),並找到了解決方案。WebSphere和StaleConnectionException

這。

public static Connection getConnection() { 
    Connection conn = null; 

    try { 
     if (ds == null) ds = (DataSource) new Utility.makeLookup(); 
     conn = ds.getConnection(); 
     conn.setAutoCommit(false); 

     // Check quality of return connection 
     Statement stmt = conn.createStatement(); 
     stmt.executeQuery("Select 1 from dual"); 
     stmt.close(); 

    } catch (Throwable t) { 
     try { 
      // Recovery 
      ds = (DataSource) new Utility.makeLookup(); 
      conn = ds.getConnection(); 
      conn.setAutoCommit(false); 
      return conn; 
     } catch (Throwable t2) { /* RIP */ } 
    } 

    return conn; 
    } 

,因爲我在第一個方法調用有6秒的第一滯後,如果我有管理StaleConnectionException時,我不喜歡這種解決方案。

我做了一個解決方法:在新的瀏覽器會話開始時測試連接,但我也不喜歡這樣。

有什麼更好的,我可以實現?

預先感謝您。

嘎嘎

回答

0

嗨,
我聽說過這個例外的,但從來沒有得到一個。這幾乎不是一個應用問題。數據源定義或數據庫設置可能有問題。 那麼你可以提供一些更多的信息嗎?

1. WAS版本,OS /架構,DB供應商/版本,JDBC驅動使用
2.數據源/連接池設置從WAS管理控制檯
3.異常堆棧跟蹤

然而,與此同時,您可以嘗試將連接池中的初始連接數設置爲零,以便在詢問時打開一個新的連接數。

0

我正面臨着這樣的問題:在我的情況下,當連接已在早上DB側超時,例如,它發生了,當第一個用戶連接到應用程序。實際上,數據庫連接池最小大小默認爲1,因此由連接池維護的最後一個連接超時。 解決方案是將其降至0(WAS7/Oracle)。我們不再面臨這個問題。

這家酒店坐落在WAS控制檯,資源> JDBC>數據源> [DS的名稱]>連接池屬性

0

我最近已經有這個問題,並發現了另一個解決方案。我以爲我會發布,如果有人遇到此線程。 java.sql.Connection對象包含一個isValid函數,該函數將建立到底層數據庫的連接。這使連接被視爲無效並被刪除。然後,您可以按照IBM article中所述重試連接。

Context ctx = null; 
DataSource dataSource = null; 
Connection conn = null; 
boolean retry = false; 
int numOfRetries = 0; 

do 
{ 
    try 
    { 
    ctx = new InitialContext(); 
    dataSource = (DataSource) ctx.lookup("My Database"); 
    conn = dataSource.getConnection(); 

    // Make sure this connection is valid before continuing 
    // This connection could be from the connection pooled 
    // and the underlying db connection could be closed. 
    if (conn.isValid(5) == false) 
    { 
     throw(new java.sql.SQLException("INVALID_CONNECTION")); 
    } 

    retry = false; 
    } 
    catch (Exception ex) 
    { 
    if (numOfRetries < 2) 
    { 
     retry = true; 
     numOfRetries++; 

     // Sleep for one second before retry 
     Thread.sleep(1000); 
    } 
    else 
    { 
     retry = false; 

     throw (ex); 
    } 
    } 
} while (retry == true); 
1

我得到一個應用程序的例外。通過在websphere管理控制檯中進行以下設置,我擺脫了這個問題。我正在使用webphere應用程序服務器8.5。其他版本也必須具有類似的選項。

管理控制檯 - >資源 - > JDBC - >數據源 - > (這是給這個問題的任何數據源) - > WebSphere Application Server的數據源屬性 - >檢查驗證新的連接 - >檢查 確認現有彙集連接 - >應用 - >保存 - >重新啓動服務器

此方法可能有點耗時,但它擺脫了異常。