最近项目组遇到了一个非常恶心的问题,项目启动成功后,系统可以正常使用,但是一两个小时之后,发现系统无法登陆成功,直接卡死!无法正常登陆跳转到门户首页!!!
错误信息如下:
2020-01-01 00:29:43 [com.xxxxx.app.aop.LogAspect]-[ERROR] - org.springframework.dao.DataAccessResourceFailureException: could not execute query; nested exception is org.hibernate.exception.JDBCConnectionException: could not execute query
系统使用的架构是nginx+tomcat,数据库使用版本18C
我们尝试了升级tomcat版本、增加数据库连接数、提高tomcat内存、升级数据库连接驱动包(从6升级到8)等等一系列方法,问题很难立即复现,必须等系统一两个小时之后会卡死!所以尝试各种以上方案,耗时几天时间,逐个排除了以上可能性,但是问题还是找不到…真的要崩溃了…
后来终于发现问题,数据库连接池使用org.apache.commons.dbcp.BasicDataSource,问题就在这里!!
必须改成org.apache.commons.dbcp2.BasicDataSource
使用驱动包:
commons-dbcp2-2.7.0.jar
commons-pool2-2.7.0.jar
原因分析:用户登陆成功后,系统会为了保持心跳,还有后台一些定时任务,一直会和系统数据库保持连接,这个时候导致系统的连接被占用,无法正常释放,这个就是dbcp数据库连接连接18C的一个bug!必须要改成dbcp2才可以!!!!!!!
其实一开始我们看错误日志的时候就判断是数据库连接的问题,我们当时尝试了更换数据库驱动,但是没有更换数据库连接池驱动!!换了就好啦!问题折腾了我们快2周的时候,记录下问题,有遇到这类问题的亲们直接拿走,不谢!!!