首先让我来描述问题
我有个系统是基于springmvc+mybatis+mysql+druid的,启动系统刚开始用没有问题,但是用着用着系统表象就是卡死
分析:
1:通过表象是不是有可能数据库锁表了,通过jvm的jstack -l pid(进程id)
如何得到进程id呢?--到jdk安装的bin目录执行 jps命令得到pid
打印出堆栈信息
此时没办法只能看druid的源码找到
此时要引起注意,看源码的时候一点要注意if条件的地方,此时我考虑是不是maxWait没有配置默认为0,此时我到自己的配置文件中配置
然后再次尝试,系统依然还是挂了,在此运行jstack堆栈信息再没有出现上面的错误,到此问题没有得到解决,告一段落
此时我发现用Druid它提供一个图形化界面
在没有解决问题之前这两个值一直不相等,打开连接数和关闭数随着请求的增多在增大,增到到连接池最大数直接挂了,问题终于算找到了,如何解决呢
1:是不是配置文件有问题,到处找资料,尝试,问题没有得到解决
2:尝试不同的url请求,其中有些url是不会扩大打开和关闭连接数之差,有些会扩大(此时问题又在缩小范围)
3:仔细看那些扩大范围的请求,发现,这些请求都是需要分页的请求,那些不会扩大的都是不涉及到分页的请求(问题又在缩小范围)
4:mybatis分页我是写了个拦截器通过Jdbc分页,此时仔细看代码发现代码里面,当打开数据库连接的时候有个连接对象忘记关闭了,就是如下的红色代码
加上去之后,再次处理问题,问题得到解决,不管怎么请求现在打开数和关闭数数据永远相等,系统正常,问题得到解决,OH Good!!!!!!
其实之间想如果这条路走不通,我想是不是可能druid版本问题,如果此条路行不通,打算换用其他连接池试试,还有会不时是spring配置有问题等等猜测,只有对问题永不放弃,什么问题都能得到解决..................