前段时间项目组升级Mybatis-Plus版本至3.4.2,上线之后风平浪静,功能一切正常,原本想着这事已经过去了,谁知道在几天后,客户说一个分页查询功能会卡死。 经过一系列反复测试是数据库连接被打满了。 为啥一个分页查询会把数据库连接打满,其他查询不会,查看SqlRunner源码发现
由此对比发现分页查询selectPage是没有关闭连接的,而其他方法在finally块都有关闭连接,所以连接池连满之后其他请求就是等待,所以卡住
解决方法 方法一: 新增一个类去继承SqlRunner类,重写selectPage方法 具体代码如下
public class SqlRunnerAdapter extends SqlRunner {
public SqlRunnerAdapter() {
super();
}
@Override
public <E extends IPage<Map<String, Object>>> E selectPage(E page, String sql, Object... args) {
if (null == page) {
return null;
}
SqlSession sqlSession = sqlSession();
try {
page.setRecords(sqlSession.selectList(SELECT_LIST, sqlMap(sql, page, args)));
}finally {
closeSqlSession(sqlSession);
}
return page;
}
private SqlSession sqlSession() {
return SqlSessionUtils.getSqlSession(SqlHelper.FACTORY);
}
private Map<String, Object> sqlMap(String sql, IPage page, Object... args) {
Map<String, Object> sqlMap = new HashMap<>();
sqlMap.put(PAGE, page);
sqlMap.put(SQL, StringUtils.sqlArgsFill(sql, args));
return sqlMap;
}
private static void closeSqlSession(SqlSession sqlSession) {
SqlSessionFactory sqlSessionFactory = SqlHelper.FACTORY;
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
}
}
重新构建发版,问题完美解决
方法二:在项目代码目录src里面新建一个与SqlRunner同样的目录,然后在其目录下新建一个SqlRunner.java,其他方法不变,只修改selectPage方法具体操作如下:
因为代码的编译顺序会优先找你src目录下面的class,其次才是第三方包。重新打包后也能解决。