记一次使用“try-with-resources“的语法导致的BUG

背景描述

最近使用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);  
	}
}
相关推荐
傲文博一2 分钟前
为什么我的产品尽量不用「外置」动态链接库
前端·后端
零日失眠者3 分钟前
【系统监控系列】005:CPU温度监控脚本
后端·python
故事不长丨5 分钟前
解锁C#编程秘籍:封装、继承、多态深度剖析
开发语言·数据库·c#
踏浪无痕5 分钟前
Maven 依赖拉不下来?一文终结所有坑点
spring boot·后端·面试
远瞻。6 分钟前
【环境配置】快速转移conda上的python环境
开发语言·python·conda
踏浪无痕7 分钟前
你真的懂泛型吗?手写 MyBatis-Plus + Jackson,揭秘框架设计的精髓
后端·json·mybatis
老青蛙8 分钟前
Easy Work-简单、易用、傻瓜式的 Java 流程引擎
java·开源
茶杯6759 分钟前
“舒欣双免“方案助力MSI-H/dMMR结肠癌治疗新突破
java·服务器·前端
随风飘的云9 分钟前
mysql的in查询列数据量非常大导致数据索引失效的解决方案
后端
我真会写代码10 分钟前
从入门到精通:Java Socket 网络编程实战(含线程池优化)
java·linux·服务器·socket·tcp/ip协议