背景描述
最近使用try-catch的时候遇到了一个问题,背景是这样的:当第一次与数据库建立连接以后执行查询完毕并没有手动关闭连接,但是当我第二次获取连接的时候报错了,显示数据库连接失败,连接已经关闭。
java
org.postgresql.util.psOlException: This connection has been closed.
解决方案
通过排查我定位到了这段代码
java
try (java.sql.Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
// 代码块...
}catch (SQLException e) {
log.error("后端服务异常:{}", e);
...
}
这种写法是Java 7引入的一种称为"try-with-resources"的语法。它是一种自动资源管理的机制,用于简化需要手动关闭资源的代码。在try块结束时,括号()中声明的资源会自动关闭,无需手动调用close()方法,也就是说不需要再使用finally来关闭资源。
这个时候也就真相大白了,原因就在于当第一次与数据库建立连接以后执行查询完毕并没有手动关闭连接但是由于使用了"try-with-resources"的语法所以已经自动关闭了数据库连接。
解决方案
- 不使用"try-with-resources"的语法
java
try{
java.sql.Connection conn =
DriverManager.getConnection(url, user, password;
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
// 代码块...
}catch (SQLException e) {
log.error("后端服务异常:{}", e);
// 代码块...
}finally{
try {
conn.commit();
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}