You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用单例模式时出现Connection closed后无法操作的SQL问题

问题原因分析

你遇到的报错核心原因是try-with-resources语句自动关闭了单例模式下的唯一数据库连接,具体细节:

  1. 你的DbUtils类通过静态代码块创建了唯一的Connection实例,每次调用getConnection()都返回同一个对象。
  2. 在BookRepository的insertBook方法中,你用try (Connection con = connect.getConnection(); ...)这种try-with-resources语法声明了Connection——这种语法会在代码块执行完毕后,自动调用con.close()方法关闭连接。
  3. 第一次调用insertBook后,单例的Connection已经被关闭;后续再调用时,getConnection()返回的是已经关闭的连接,执行数据库操作自然会抛出"连接已关闭"的错误。
解决方案

方案1:取消Connection单例,每次获取新连接

修改DbUtils的getConnection()方法,每次调用都创建新的连接,而不是返回同一个实例:

public class DbUtils {
    private static final String DB_URL = "jdbc:mysql://localhost:3306/library";
    private static final String USER = "root";
    private static final String PASS = "12345";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(DB_URL, USER, PASS);
    }
}

这样每次try-with-resources关闭的是当前方法创建的连接,不会影响后续调用。

方案2:改用数据库连接池(生产环境推荐)

单例Connection本身就不适合实际应用场景,尤其是多线程环境下会出现并发问题。更合理的做法是使用连接池(比如HikariCP、Apache Commons DBCP),连接池会负责连接的创建、复用和销毁,避免手动管理连接的麻烦。

错误方案提醒

不要试图把PreparedStatement也改成单例,或者把PreparedStatement移到DbUtils里——这不仅解决不了连接关闭的问题,还会带来线程安全、SQL注入风险等更多问题。

内容的提问来源于stack exchange,提问作者Narmin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:30:48