我使用以下方法(成功)连接到数据库:
java.sql.Connection connect = DriverManager.getConnection(
"jdbc:mysql://localhost/some_database?user=some_user&password=some_password");
在一段时间后,我应该检查连接是否仍然打开和关闭?
我希望有connect.isConnected();
这样的东西供我使用。
答案 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");
}