簡體   English   中英

Java JDBC 連接狀態

[英]Java JDBC connection status

我(成功)使用以下方法連接到數據庫:

java.sql.Connection connect = DriverManager.getConnection(
  "jdbc:mysql://localhost/some_database?user=some_user&password=some_password");

一段時間后,我應該檢查什么以查看連接是否仍處於打開狀態?
我希望像connect.isConnected();這樣的東西。 可供我使用。

你最好的機會是只對一個表執行一個簡單的查詢,例如:

select 1 from SOME_TABLE;

哦,我剛剛看到有一個自 1.6 以來可用的新方法:

java.sql.Connection.isValid(int timeoutSeconds)

如果連接尚未關閉且仍然有效,則返回 true。 當調用此方法時,驅動程序應提交有關連接的查詢或使用某種其他機制來肯定地驗證連接仍然有效。 驅動程序提交的用於驗證連接的查詢應在當前事務的上下文中執行。

沒有。 只需執行您的查詢。 如果連接已終止,那么您的 JDBC 驅動程序將重新連接(如果它支持它,並且您在連接字符串中啟用了它——大多數不支持它),否則您將得到一個異常。

如果您檢查連接是否正常,它可能會在您實際執行查詢之前失敗,因此通過檢查您絕對不會獲得任何好處。

也就是說,許多連接池通過在分發連接之前執行SELECT 1類的操作來驗證連接。 但這只不過是執行查詢,因此您不妨執行業務查詢。

使用Connection.isClosed()函數。

JavaDoc指出:

檢索此Connection對象是否已關閉。 如果在其上調用了 close 方法或發生了某些致命錯誤,則連接將關閉。 只有在調用方法 Connection.close 之后調用此方法時,才能保證返回true

你也可以使用

public boolean isDbConnected(Connection con) {
    try {
        return con != null && !con.isClosed();
    } catch (SQLException ignored) {}

    return false;
}

如果您使用的是 MySQL

public static boolean isDbConnected() {
    final String CHECK_SQL_QUERY = "SELECT 1";
    boolean isConnected = false;
    try {
        final PreparedStatement statement = db.prepareStatement(CHECK_SQL_QUERY);
        isConnected = true;
    } catch (SQLException | NullPointerException e) {
        // handle SQL error here!
    }
    return isConnected;
}

我沒有用其他數據庫測試過。 希望這是有幫助的。

無論供應商的實現如何,低成本的方法是從進程內存或服務器內存中選擇一些內容,例如 DB 版本或當前數據庫的名稱。 IsClosed 的實現非常糟糕。

例子:

java.sql.Connection conn = <connect procedure>;
conn.close();
try {
  conn.getMetaData();
} catch (Exception e) {
  System.out.println("Connection is closed");
}

如果您使用 JDBC 獲取默認連接,這是一個簡單的解決方案

 private Connection getDefaultConnection() throws SQLException, ApiException {
    Connection connection = null;
    try {
         connection = dataSource.getConnection ();
    }catch (SQLServerException sqlException) {
        // DB_UNAVAILABLE EXCEPTION
    }
    return connection;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM