记一次使用“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);  
	}
}
相关推荐
武子康9 分钟前
大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
大数据·后端·mysql
SimonKing13 分钟前
JetBrains 用户狂喜!这个 AI 插件让 IDE 原地进化成「智能编码助手」
java·后端·程序员
茶杯梦轩14 分钟前
从零起步学习RabbitMQ || 第三章:RabbitMQ的生产者、Broker、消费者如何保证消息不丢失(可靠性)详解
分布式·后端·面试
小码哥_常15 分钟前
别再乱加exclusion了!Maven依赖冲突有妙解
后端
狂奔小菜鸡16 分钟前
Day39 | Java中更灵活的锁ReentrantLock
java·后端·java ee
IvanCodes16 分钟前
一、消息队列理论基础与Kafka架构价值解析
大数据·后端·kafka
Nyarlathotep011317 分钟前
gin03:请求中的参数
后端·go
用户73440281934218 分钟前
java通过SpringBoot操作elasticsearch实现基本的增删改查
后端
小码哥_常21 分钟前
一文带你吃透@Async,让异步编程so easy!
后端
元亨利贞44823 分钟前
C#中空值校验情况说明
后端