一、概述
在本文中,我们将讨论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 语句之前验证连接的替代方法。
0 评论