背景:
软件上线几个小时候后,出现服务可不用问题,服务的任何接口都不可用,查看后台日志:
定位过程
给人的第一反应,就是数据库连接池资源耗,无可用session,数据库连接池使用的是springboot默认的hikari组件,查询改组件配置方法,项目配置正常(hikari配置连接:blog.csdn.net/feiying0can… 经过长时间百度查询,看到一遍文章是hikari组件bug导致,感谢倔友的文章(juejin.cn/post/692311…
但是其他微服务和该服务配置一致,其他服务都没有问题。为了验证自身环境是有组件bug,配置环境打印hikari的debug日志。为了快速复现问题,将连接池线程maximum-pool-size和minimum-idle都设置为5,然后启动微服务。
可以看出total为5,idle为5,线程池线程充足。
测试服务的几个接口十几次,每个接口都进行了操作数据库的动作,hikaripool日志正常,空闲线程一直都是5个(说明数据库操作完之后,session进行了释放)。问题未复现。
没办法,只能遍历接口进行测试了。每次测试接口后,查询后台hikaripool日志是否正常,功夫不负有心人,终于复现了问题,点击某个接口后,发现了异常日志:
active的数量不清空,证明了session不释放。继续测试改接口:
可用线程session为0.再回去测试其他原先测试正常的接口,后端也抛出异常错误。至此该服务不可用。
详细查看该接口代码的特殊之处,发现该接口在查询数据库的时候,使用了SqlRunner.db().selectPage来进行数据的查询。
查看方法源码:
和其他接口对比:
该方法竟然没有释放session。然后查询是否有相同案例:
详见链接:blog.csdn.net/qq_29276601…
我们项目使用的mybatis-plus版本是3.4.0。原来是mybatis-plus组件的bug,去官网进一步查看版本的更新日志:
解决方案
1)更新mybatis-plus组件为最新版本
2)重新SqlRunner
(本项目修改方式:更新最新版本的话,代码改动量较大,选择了方案2进行修改,并验证通过)