Java JDBC连接状态

时间:2011-10-14 07:56:52

标签: java sql jdbc

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

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

在一段时间后,我应该检查连接是否仍然打开和关闭? 我希望有connect.isConnected();这样的东西供我使用。

6 个答案:

答案 0 :(得分:42)

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

select 1 from SOME_TABLE;

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

java.sql.Connection.isValid(int timeoutSeconds)

  

如果连接尚未关闭且仍然有效,则返回true。   驱动程序应提交有关连接的查询或使用其他一些查询   积极验证连接的机制仍然有效   这个方法叫做。驱动程序提交的查询以进行验证   连接应在当前环境中执行   事务。

答案 1 :(得分:24)

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

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

也就是说,许多连接池通过在递送连接之前执行SELECT 1之类的操作来验证连接。但这仅仅是执行查询,因此您也可以执行业务查询。

答案 2 :(得分:16)

使用Connection.isClosed()功能。

JavaDoc州:

  

检索此Connection对象是否已关闭。一个   如果已在其上调用方法close或者如果是,则关闭连接   发生了某些致命错误。保证这种方法   仅在方法Connection.close之后调用它时返回true   被称为。

答案 3 :(得分:7)

您也可以使用

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;
}

答案 4 :(得分:4)

如果您使用的是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;
}

我没有测试过其他数据库。希望这有用。

答案 5 :(得分:0)

无论供应商采用哪种实施方式,低成本方法都是从进程内存或服务器内存中选择某些内容,例如DB版本或当前数据库的名称。 IsClosed的实现非常差。

示例:

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