Mybatis-plus升级至3.4.2之后,使用selectPage不释放连接

973 阅读1分钟

前段时间项目组升级Mybatis-Plus版本至3.4.2,上线之后风平浪静,功能一切正常,原本想着这事已经过去了,谁知道在几天后,客户说一个分页查询功能会卡死。 经过一系列反复测试是数据库连接被打满了。 为啥一个分页查询会把数据库连接打满,其他查询不会,查看SqlRunner源码发现

image.png

image.png

image.png 由此对比发现分页查询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方法具体操作如下:

image.png 因为代码的编译顺序会优先找你src目录下面的class,其次才是第三方包。重新打包后也能解决。