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

Service中通过SqlSessionFactory创建的SqlSession是否需要手动关闭?

结论

你这种手动通过SqlSessionFactory.openSession()自行打开的SqlSession,Spring不会帮你自动管理关闭,必须要你手动关闭。

原因说明

  • Spring自动管理SqlSession的场景仅限于你通过@Autowired直接注入Mapper、或者使用SqlSessionTemplate的场景,这时候Spring会在事务结束后自动帮你回收关闭SqlSession。
  • 你现在是显式调用openSession()方法拿到的会话,属于你自行创建的会话实例,Spring的事务管理器不会感知到这个会话的存在,自然也不会帮你自动关闭,如果不手动关闭会直接导致数据库连接泄漏,运行时间长了会把连接池的可用连接占满。

优化建议

推荐你用try-with-resources语法来自动关闭资源,避免遗漏关闭的问题,修改后的代码参考如下:

@Override
public void insertRoleRelation(Long userId,List<Long> roleIdList) {
    // try-with-resources会在代码块执行结束后自动调用sqlSession的close方法
    try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
        UserRoleRelationMapper sessionUserRoleRelationMapper = sqlSession.getMapper(UserRoleRelationMapper.class);
        if (!CollectionUtils.isEmpty(roleIdList)) {
            roleIdList.forEach(i -> {
                // 执行插入关联逻辑
            });
        }
        sqlSession.flushStatements();
        // 注意如果你的方法没有加@Transactional注解托管事务,还要手动提交事务,否则数据不会落库
        sqlSession.commit();
    }
}
  • 如果你的方法已经加了@Transactional注解由Spring托管事务,也可以直接注入指定ExecutorType为BATCH的SqlSessionTemplate来实现批量操作,不用自己管理会话的开关和事务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:51:00