Java JDBC连接状态

Mon*_*ded 37 java sql jdbc

我(使用以下方法)成功连接到数据库:

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

一段时间后我应该检查连接是否仍然打开和关闭?
我希望有一些类似connect.isConnected();我可以使用的东西.

hom*_*ome 46

您最好的机会是对一个表执行简单查询,例如:

select 1 from SOME_TABLE;
Run Code Online (Sandbox Code Playgroud)

哦,我刚看到自1.6以来有一种新的方法:

java.sql.Connection.isValid(int timeoutSeconds):

如果连接尚未关闭且仍然有效,则返回true.驱动程序应提交有关连接的查询或使用其他一些机制,以便在调用此方法时肯定地验证连接是否仍然有效.驱动程序提交的用于验证连接的查询应在当前事务的上下文中执行.


dty*_*dty 25

没有.只需执行您的查询.如果连接已经死亡,您的JDBC驱动程序将重新连接(如果它支持它,并且您在连接字符串中启用它 - 大多数不支持它),否则您将获得异常.

如果检查连接是否已启动,则在实际执行查询之前可能会出现问题,因此通过检查您无需获得任何结果.

也就是说,许多连接池通过执行类似于SELECT 1将连接交付之前的操作来验证连接.但这仅仅是执行查询,因此您也可以执行业务查询.

  • 在使用它之前测试连接有一些明确的好处(特别是如果它是一个长期连接并且底层网络可能已经使用过它).但这也是准确的,因为你仍然需要处理自己代码中的错误,因为它可能随时都会出现问题. (2认同)

Buh*_*ndi 16

使用Connection.isClosed()功能.

JavaDoc的状态:

检索此Connection对象是否已关闭.如果已在其上调用方法close或者发生了某些致命错误,则会关闭连接.true只有在调用Connection.close方法后调用此方法时,才能保证此方法返回.

  • 正如javadoc所说,**在这种情况下不会给出有效答案.它只会告诉你是否调用了'close()`. (5认同)
  • 在使用Postgres JDBC驱动程序(至少)进行一些实验后,好吧,基本上,如果底层连接"丢失",`isClosed()`仍然会返回true.但是,当你*使用*连接时,它会引发任何异常,在那之后,`isClosed()`现在将返回true.所以基本上你可以"逃避"使用`isClosed`(并避免额外调用`isValid()`的延迟),如果你能在某种程度上提供一个中断的查询在这里或那里.除此之外``isValid()`是一种很好的测试方法,但需要额外的往返时间. (3认同)
  • 不知道为什么这会得到赞成,答案中省略了 Javadoc 的这一部分:“通常无法调用此方法来确定与数据库的连接是否有效或无效。典型的客户端可以通过捕获尝试操作时可能抛出的任何异常来确定连接无效。 (3认同)

小智 9

你也可以使用

public  boolean isDbConnected(con Connection) {
    //final String CHECK_SQL_QUERY = "SELECT 1";
    try {
        if(!con.isClosed() || con!=null){
            return true;
        }
    } catch (SQLException e) {
        return false;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 应该是,如果(con!= null ||!con.isClosed())使得您的检查首先在对象上,如果它是null,则它将不会继续验证IF语句.你的将抛出异常因为con可能是NULL.然后你根本不需要整个尝试捕获. (6认同)