MybatisPlus3.4.2使用SqlRunner分页查询不释放连接

前一段时间项目组进行了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版权协议,转载请附上原文出处链接和本声明。