被一个数据库链接泄漏困扰了1天多,记录一下。
在执行某个业务(运行Outbound)后一段时间,就会报没法getConnection的错误。
由于这段业务包含了 多个sql, 多个批量保存。不能肯定是哪一个sql引起的。一度觉得是批量保存的语法致使的。
把断点打到GenericObjectPool的 borrowObject() ,发现this.numActive属性会一直递增。而正常状况下是递增,减小交替。 当递增到maxActive后就报错了。
在application.xml 里面添加了各类配置,可是没有效果。只能显示connect信息,不能定位到哪一个语句错了。加了白加。
<!--系统会进行无效的Connection的回收-->
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="500"/>
<!--系统会进行无效的Connection的回收的日志-->
<property name="logAbandoned" value="true"/>
后面百度"mybatis 链接泄漏"
发现了这篇文章,
马上想起来,我为了批量 保存的性能,也用了手动启动SqlSession 的代码
最后加上
sqlSession.close();就行了。实际上我注释了这段,改用<foreach>的写法,性能没差多少
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
OutboundNumDao mapper = sqlSession.getMapper(OutboundNumDao.class);
mapper.updateCalledById(calledList);
sqlSession.commit();
sqlSession.close();