項目使用 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,可能導致池狀態不一致。removeAbandoned 是兜底機制,不應依賴它回收業務連接。優先使用 MyBatis 聲明式事務(@Transactional 或 XML 配置),避免手動獲取 Connection。若必須手動,嚴格遵循 try-finally 歸還模式。