JDBC 連接狀態
- java
- JDBC
一、概述
在本文中,我們將討論 JDBC 連接狀態的某些方面。首先,我們將看到連接丟失的最常見原因。然後,我們將學習如何確定連接狀態。
我們還將學習如何在運行 SQL 語句之前驗證連接。
2. JDBC連接
Connection類負責與數據源進行通信。由於各種原因,連接可能會丟失:
- 數據庫服務器已關閉
- 網絡連接
- 重用關閉的連接
在連接丟失時運行任何數據庫操作將導致SQLException
。此外,我們可以檢查異常以獲取有關問題的詳細信息。
3. 檢查連接
有不同的方法來檢查連接。我們將看看這些方法來決定何時使用它們。
3.1. 連接狀態
我們可以使用isClosed()
方法檢查Connection
狀態。使用此方法,無法授予 SQL 操作。但是,檢查連接是否打開會很有幫助。
讓我們在運行 SQL 語句之前創建一個狀態條件:
public static void runIfOpened(Connection connection) throws SQLException
{
if (connection != null && !connection.isClosed()) {
// run sql statements
} else {
// handle closed connection path
}
}
3.2.連接驗證
即使打開了連接,也可能由於上一節中描述的原因而丟失。因此,可能需要在運行任何 SQL 語句之前驗證連接。
從 1.6 版開始,
Connection
類提供了一種驗證方法。首先,它向數據庫提交驗證查詢。其次,它使用timeout
參數作為操作的閾值。最後,如果操作在timeout
內成功,則連接被標記為有效。
讓我們看看如何在運行任何語句之前驗證連接:
public static void runIfValid(Connection connection)
throws SQLException
{
if (connection.isValid(5)) {
// run sql statements
}
else {
// handle invalid connection
}
}
在這種情況下, timeout
為 5 秒。零值表示超時不適用於驗證。另一方面,小於零的值將拋出SQLException
。
3.3.自定義驗證
創建自定義驗證方法有充分的理由。例如,我們可以使用沒有驗證方法的遺留 JDBC。同樣,我們的項目可能需要在所有語句之前運行自定義驗證查詢。
讓我們創建一個方法來運行預定義的驗證查詢:
public static boolean isConnectionValid(Connection connection)
{
try {
if (connection != null && !connection.isClosed()) {
// Running a simple validation query
connection.prepareStatement("SELECT 1");
return true;
}
}
catch (SQLException e) {
// log some useful data here
}
return false;
}
首先,該方法檢查連接狀態。其次,它嘗試運行驗證查詢,成功時返回true
。最後,如果驗證查詢未運行或失敗,則返回false
。
現在我們可以在運行任何語句之前使用自定義驗證:
public static void runIfConnectionValid(Connection connection)
{
if (isConnectionValid(connection)) {
// run sql statements
}
else {
// handle invalid connection
}
}
當然,運行一個簡單的查詢是驗證數據庫連接性的好選擇。但是,根據目標驅動程序和數據庫,還有其他有用的方法:
- 自動提交 – 使用
connection.getAutocommit()
和connection.setAutocommit()
- 元數據——使用
connection.getMetaData()
4.連接池
數據庫連接在資源方面很昂貴。連接池是管理和配置這些連接的好策略.
簡而言之,它們可以降低連接生命週期的成本。
所有 Java 連接池框架都有自己的連接驗證實現。此外,它們中的大多數使用可參數化的驗證查詢。
以下是一些最流行的框架:
- Apache Commons DBCP——
validationQuery, validationQueryTimeout
- Hikari CP——
connectionTestQuery, validationTimeout
- C3P0 –
preferredTestQuery
測試查詢
5. 結論
在本文中,我們了解了 JDBC 連接狀態的基礎知識。我們回顧了Connection
類的一些有用的方法。之後,我們描述了一些在運行 SQL 語句之前驗證連接的替代方法。