被一個數據庫鏈接泄漏困擾了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();