Cause: java.sql.SQLNonTransientConnectionException: (conn=6681562) Connection re

1,104 阅读3分钟

项目上次部署了了一套SIT,但是在SIT环境上经常报这种异常,频率较高,但是又是偶然发生,不影响主题业务,排查了很久,搞得怀疑人生....
日志截图:

image.png

出现问题的时候,整个思路是这样的:
(1)第一时间想到的是,是否是部署的容器云平台有问题。
(2)其次,因为报异常一般是查询接口报错,所以有可能是接口查询的sql有问题
(3)第三种可能的原因是Druid数据源配置有问题
(4)最后,由于SIT暂时使用的是DEV库MariaDB,(DEV库数据多),并且使用的数据库驱动是org.mariadb.jdbc.Driver,也可能是数据库和驱动版本不兼容导致。

于是按照思路进行排查。 为判断是否是原因(1),将基础数据服务部署到了一台虚拟机上,然后控制流量使流量打到这条虚拟机的基础数据服务,但是虚拟机部署也会出现上述异常。因此排除容器云平台导致

接着验证第二个思路:但是个人感觉第二个导致的可能性几乎不存在,从日志上来看,字面意思是连接池没有短暂的数据库连接导致会频繁重连,因此怀疑是sql语句执行时间超过了最大等待时间而导致,但是几乎普通的查询语句SELECT都有可能报异常,从执行计划来看,不是这种问题导致。另外,组长提出,可能是由于其他服务业务量涉及到事务,并且事务执行的时间过长,导致连接失效,但是执行sql时,使用了失效的连接从而导致异常产生。但是这种情况也可以排除,因为单独运行一个不涉及事务的服务时,依然报异常,真TM的TM的诡异

其实,很有可能是第三种原因,由于数据库连接池一般会保持一定数量的连接,但是如果长时间不使用,那连接池有可能会释放连接,从而导致异常产生,因此,特别验证了Druid连接池的保活机制,添加了相关配置

datasource:
  type: com.alibaba.druid.pool.DruidDataSource
  url: jdbc:mysql://XXXXX.63:3306/XXXX?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
  username: XXX
  password: XXX
  driverClassName: org.mariadb.jdbc.Driver
  druid:
    initialSize: 0
    maxActive: 20
    minIdle: 5
    maxWait: 10000
    validationQuery: select 'x'
    testOnBorrow: false
    testWhileIdle: true
    timeBetweenEvictionRunsMillis: 18800
    filters: stat,wall,log4j
    keepAlive: true

keepAlive: true即一直让连接池保活 不过,依然无济于事......

到这里几乎黔驴技穷了,可能的原因几乎验证了个遍,如果不是第四种原因,那真的不知道该怎么办!!!!!!!!!!!

验证最后一种可能性,数据库使用的是MariaDB 10.4.18,相当于MySQL5.7, 使用的驱动类为org.mariadb.jdbc.Driver,版本ojdbc6-11.2.0.1.0(一脸懵逼),于是将驱动换为com.mysql.jdbc.Driver,版本为mysql-connecttor 11.0.18, 发版运行后,与其他没有更换的进行对比,异常没再复现,其他服务依然会抛这个异常,证明确实是驱动原因(太tm坑了.....)