2008-11-08 54 views
6

如何檢查JDBC數據庫中的打開連接?以編程方式檢查JDBC中的打開連接

注意:conn.isClosed()不能用於此。

+0

中的OracleConnection實現你要知道,如果你的應用程序有一個連接打開或你想知道,如果DB已經打開的連接任何東西。 – sblundy 2008-11-08 15:38:35

+0

我想實現連接池。 – 2008-11-10 15:11:23

+0

檢查出來[爪哇JDBC連接狀態(http://stackoverflow.com/a/30888132/782535) – 2015-06-17 09:54:49

回答

2

通常,連接池也會使用Connection.isClosed()方法來檢查連接是否仍然有效。問題是並非所有JDBC驅動程序都能正確處理此調用。所以我假設有一些簡單的檢查陳述就像RealHowTo所說的那樣。對於Oracle,他已經提到了「SELECT 1 FROM Dual」,它應該始終對Oracle數據庫成功。我認爲對於不同的數據庫有類似的查詢。我記得在之前的項目中,我們也實現了一個自己的連接池,它使用了這種驗證查詢。

8

喜歡的東西:

Statement stmt = null; 
ResultSet rs =null; 
try { 
    stmt = conn.createStatement(); 
    // oracle 
    rs = stmt.executeQuery("SELECT 1 FROM Dual"); 
    // others 
    // rs = stmt.executeQuery("SELECT 1"); 
    if (rs.next()) 
     return true; // connection is valid 
} 
catch (SQLException e) { 
    // TODO : log the exception ... 
    return false; 
} 
finally { 
    if (stmt != null) stmt.close(); 
    if (rs != null) rs.close(); 
} 

注意的是,如果連接是從連接池(在例如應用服務器),未來則池可以有一個機制來檢查連接是否有效。使用BEA,您可以在「測試保留」屬性中指定SELECT。

如果你正在開發你自己的游泳池,那麼你可能想看看別人是怎麼做的(例如Proxool)。

1

this張貼。

引用的解決方案與此處發佈的解決方案類似(對DUAL進行快速查詢以進行驗證),但也有一個有趣的解決方案,由JBoss專用於Oracle,使用Oracle JDBC Connection類中專有的PING方法。請參閱代碼here

//尼古拉斯