前一段时间项目组进行了MybatisPlus版本升级,升到了最新的3.4.2版本。其它功能正常运行。突然某一天测试发现某一个功能打开列表页会卡住。
经过一系列测试发现是数据库连接满了。查看SqlRunner源码可以看出来
@Transactional
@Override
public boolean update(String sql, Object... args) {
SqlSession sqlSession = sqlSession();
try {
return SqlHelper.retBool(sqlSession.update(UPDATE, sqlMap(sql, args)));
} finally {
closeSqlSession(sqlSession);
}
}
/**
* 根据sql查询Map结果集
* <p>SqlRunner.db().selectList("select * from tbl_user where name={0}", "Caratacus")</p>
*
* @param sql sql语句,可添加参数,格式:{0},{1}
* @param args 只接受String格式
* @return ignore
*/
@Override
public List<Map<String, Object>> selectList(String sql, Object... args) {
SqlSession sqlSession = sqlSession();
try {
return sqlSession.selectList(SELECT_LIST, sqlMap(sql, args));
} finally {
closeSqlSession(sqlSession);
}
}
其它方法在finally块中都存在调用closeSqlSession方法
closeSqlSession(sqlSession);
而关于分页方法selectPage中却是这么写的
@Override
public <E extends IPage<Map<String, Object>>> E selectPage(E page, String sql, Object... args) {
if (null == page) {
return null;
}
page.setRecords(sqlSession().selectList(SELECT_LIST, sqlMap(sql, page, args)));
return page;
}
说明是这里没有释放连接,连接池连满后其它请求就是等待,所以卡住
解决方法
新增SqlRunnerAdapter适配器,继承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);
}
}
重新发版,问题完美解决~
该问题已在后继版本中进行修复,可以升级版本解决
版权声明:本文为qq_29276601原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。