繁体   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