记一次使用“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 分钟前
Lombok 注解使用场景终极总结
java·数据库·mysql
xiaoyaohou1117 分钟前
023、数据增强改进(二):自适应数据增强与AutoAugment策略
开发语言·python
鬼圣18 分钟前
Python 上下文管理器
开发语言·python
星空椰31 分钟前
JavaScript 基础进阶:分支、循环与数组实战总结
开发语言·javascript·ecmascript
yong999038 分钟前
IHAOAVOA:天鹰优化算法与非洲秃鹫优化算法的混合算法(Matlab实现)
开发语言·算法·matlab
Stella Blog1 小时前
狂神Java基础学习笔记Day03
java·笔记·学习
t***5441 小时前
有哪些常见的架构设计模式在现代C++中应用
开发语言·c++
IT_陈寒1 小时前
Redis的内存溢出坑把我整懵了,分享这个血泪教训
前端·人工智能·后端
人间打气筒(Ada)1 小时前
「码动四季·开源同行」python语言:用户交互
开发语言·python·基本数据类型·注释·变量·常量·文件头
zopple2 小时前
四大编程语言对比:PHP、Python、Java与易语言
java·python·php