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

MyBatis 手動獲取 Connection 後是否需關閉?Druid 連接池回收機制實測

     編輯:程式設計綜合問答

問題場景

項目使用 Druid + MyBatis,因需手動管理事務,通過 SqlSessionFactory.openSession() → SqlSession.getConnection() 獲取連接,疑慮:不手動 close() 會洩漏嗎?連接是否仍受池管理?

實測結論

必須手動關閉(或歸還)。實測 30 分鐘後觸發 Druid removeAbandoned 機制強制回收,拋出大量異常,證明連接未自動歸還池中。

正確用法

SqlSession session = sqlSessionFactory.openSession();
Connection conn = session.getConnection();
try {
    conn.setAutoCommit(false);
    // 業務操作
    conn.commit();
} catch (Exception e) {
    conn.rollback();
} finally {
    // 關鍵:歸還連接給池
    session.close(); // 會調用 connection.close() 實際為歸還池
}

原理解析

  • SqlSession 持有連接,session.close() 會將連接歸還池(非物理關閉)。
  • 若直接用 conn.close() 繞過 Session,可能導致池狀態不一致。
  • Druid 的 removeAbandoned 是兜底機制,不應依賴它回收業務連接。

最佳實踐

優先使用 MyBatis 聲明式事務(@Transactional 或 XML 配置),避免手動獲取 Connection。若必須手動,嚴格遵循 try-finally 歸還模式。

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