MyBatis 3.4.0+ 版本中 SqlSession 实现 AutoCloseable,可安全使用 try-with-resources 自动关闭;低于该版本需手动在 finally 中调用 close(),否则可能导致连接泄漏。

MyBatis 中不能直接用 try-with-resources 自动关闭 SqlSession,因为 SqlSession 接口并未实现 AutoCloseable(在 MyBatis 3.4.0+ 版本中才开始实现)。所以能否安全使用 try-with-resources 取决于你使用的 MyBatis 版本。
确认 MyBatis 版本是否支持 AutoCloseable
从 MyBatis 3.4.0 起,SqlSession 接口继承了 AutoCloseable,因此可被 try-with-resources 管理。若版本低于此(如 3.3.x),则会编译报错或运行时异常。
- 检查 pom.xml 中的依赖版本:
<version>3.4.0</version>或更高 - 查看源码或 Javadoc:确认
SqlSession是否声明extends AutoCloseable
正确使用 try-with-resources 开启 SqlSession
只要版本支持,就可以像操作文件流一样安全开启和自动关闭:
批量分析录音转写,输出多维度拓客报告。触发词:录音分析、总结、音频总结、拜访记录总结。当用户提及「分析录音」「看看录音数据」「最近的录音」「通话记录」且意图为批量统计/分析时触发。仅出现「录音」或「拜访」时需结合上下文,若仅查看单条详情则不触发。
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
// 业务逻辑...
} // ← 自动调用 sqlSession.close()
- 推荐使用
openSession()(非自动提交),避免意外提交脏数据 - 如需事务控制,应配合
sqlSession.commit()/rollback(),但注意:一旦显式调用了close()或 try 块结束,资源即释放,不能再调用commit() - 不要在 try 块内手动调用
sqlSession.close(),否则可能触发重复关闭异常
不支持 AutoCloseable 时的安全替代方案
若仍在使用老版本(如 3.3.x),必须手动管理生命周期:
立即学习“Java免费学习笔记(深入)”;
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
- 务必在
finally块中关闭,防止因异常导致连接泄漏 - 可封装为工具方法,例如
SqlSessionUtils.getSqlSession(...)并统一 close - Spring 集成环境下无需手动管理——由
SqlSessionTemplate或@Mapper自动处理
注意事项与常见陷阱
即使支持 AutoCloseable,也要注意以下细节:
-
openSession(true)开启自动提交后,事务不可控,慎用于写操作 - SqlSession 是**非线程安全**的,每个线程应独占一个实例,不可复用或共享
- 不要将 SqlSession 存入静态变量、单例或长生命周期对象中
- 批量操作建议用
openSession(ExecutorType.BATCH),但需手动 commit

















