1.先上图,大家看看是不是同一个错误。
2.我开发的架构是JFinal+jdk8+idea
3.背景
这几天在开发一个纯后端的数据抓取程序时,在本地测试是完全没有问题的,idea运行程序的过程中正常执行,也没有出现什么错误的语句。但是!!之后部署在linux正式运行时,发现时不时的出现上图的错误,虽然该错误不影响程序的正常执行,但是发现连接同一个数据库的其他后端程序也在同一时刻出现该错误,该错误的出现频率不算高,一个小时之内可能会出现一两次。并且发现在报错误的这几分钟之内,程序是无法正常运行的,几分钟过去了之后,程序才接着之前的运行。
如果有相同的情况,则可以试试以下的方法。
1.由于jfianl框架没有mybatis之类的配置文件,连接池的配置是在插件类中写死的,如下
死锁出现的原因目前我所了解的原因之一就是连接池占用数据库的连接,但是数据库本身的连接数是有限的,当连接池需要连接但是连接数已经满了的时候,会出现死锁问题。上图的默认配置可能是出现死锁的原因之一,所以我尝试了下图的修改
ps:这里的参数配置是我自己决定的,请根据自己实际的开发需求配置。
经一天时间的测试,发现我的程序没有再出现死锁的问题。
2.一天之后,我发现我的10个左右的程序连接的是同一个库,并使用了上图的配置,这段时间内是没有发现有死锁的出现的。但是我的另一个程序连接的是另外一个库,在这一天的时间内,出现了两次死锁问题(所以不推荐使用第一种办法),没有发现是什么原因,可能原因之一就是该库被其他程序(不是我部署的)频繁访问。所以我尝试了解决方案2,直接替换掉c3p0连接池,换用druid。原因就是我在jfinal官网看到开发者说c3p0可能会出现问题,换用druid更好。
经测试,没有再出现死锁的问题,个人比较推荐采用**第二种方法**。
ps:至于druid怎么换,框架不同,我就不说了。
当初我遇见这个问题,也是在网上找了很多的解决办法,帖子的留言也有很多说不清楚怎么解决的,想分享一下自己的解决过程,希望能够帮助和我遇到一样问题的人。
可能由于开发架构的不同,实际效果有所区别,我是已经解决了的,仅供参考。