首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JDBC 封裝類資源釋放難題:ResultSet 回傳後誰負責關閉 Connection?

     編輯:程式設計綜合問答

封裝 SQL_ExecuteQuery 回傳 ResultSet 時,Connection、PreparedStatement 若在方法內關閉,ResultSet 會立即失效;若不關閉,呼叫端又難以取得這些資源進行關閉。

三種主流解法

1. 讀完立即複製到集合,關閉資源再回傳集合 (推薦)

public List> query(String sql, Object... params) {
    try (Connection con = getConnection();
         PreparedStatement ps = con.prepareStatement(sql)) {
        // set params...
        try (ResultSet rs = ps.executeQuery()) {
            List> list = new ArrayList<>();
            ResultSetMetaData md = rs.getMetaData();
            while (rs.next()) {
                Map row = new HashMap<>();
                for (int i=1;i<=md.getColumnCount();i++)
                    row.put(md.getColumnLabel(i), rs.getObject(i));
                list.add(row);
            }
            return list; // 資源已自動關閉
        }
    }
}

2. 使用 C3P0/Druid 連線池 + ThreadLocal 綁定連線

DAO 方法不關閉連線,由 Filter/Interceptor 在請求結束時統一歸還。

3. 回傳自定義可關閉的 Wrapper

public class CloseableResultSet implements AutoCloseable {
    private final ResultSet rs;
    private final Statement st;
    private final Connection con;
    // 委派 next(), getXxx()...
    @Override public void close() { /* 依序關閉 rs, st, con */ }
}

建議

**方案 1 最簡單、最安全**,適用於中小型專案。大型系統建議引入 Spring JDBC Template 或 MyBatis,由框架統一管理資源生命週期。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved