记一次使用“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);  
	}
}
相关推荐
Java_2017_csdn6 分钟前
ReentrantLock 与 Redis RLock 对比解读
java
YDS8296 分钟前
Small Spring IOC篇:实现 Bean 的定义、注册、获取
java·spring
大勇前进7 分钟前
从 OC 到 Swift,老 iOS 开发者踩过的 10 个语法大坑
后端
边境悍匪10 分钟前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
我的xiaodoujiao11 分钟前
Django 基础知识详细图文教程 9-Django 模板引擎 2
开发语言·数据库·后端·django
菜鸟~noob23314 分钟前
【太空电子战】从CCS到Meadowlands:反通信系统的二十年演进史【含matlab代码】
开发语言·matlab
烈风逍遥29 分钟前
第五篇:通用 LLM 流式对话:前后端联接的完整实现
前端·后端·架构
需要8261 小时前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
Ticnix1 小时前
别再手动上线了:一条命令带备份、健康检查和自动回滚
后端·python·ci/cd
ArkPppp1 小时前
如何从零上线一个耐造的Redis缓存系统——最直接最不绕弯子的方式
后端·ai编程