严重: testWhileIdle is true, validationQuery not set

一时失言乱红尘 2023-10-10 15:09 171阅读 0赞

在语法上的需要注意的:

MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL

  1. static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
  2. static final String DB_URL = "jdbc:mysql://localhost:3306/test";

MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL

  1. static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
  2. static final String DB_URL = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";

d344bd4a32274f78ae0a7a1422f6bb2e.png

testWhileIdle is true, validationQuery not set

出现这个错误时 druid.properties 文件如下:

  1. driverClassName=com.mysql.cj.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/project2?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
  3. username=root
  4. password=root
  5. # 初始化连接数量
  6. initialSize=10
  7. # 最大连接数
  8. maxActive=10000
  9. # 最大等待时间
  10. maxWait=3000

需要增加以下配置:

  1. driverClassName=com.mysql.cj.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/project2?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
  3. username=root
  4. password=root
  5. # 初始化连接数量
  6. initialSize=10
  7. # 最大连接数
  8. maxActive=10000
  9. # 最大等待时间
  10. maxWait=3000
  11. filters=stat
  12. timeBetweenEvictionRunsMillis=60000
  13. minEvictableIdleTimeMillis=300000
  14. validationQuery=SELECT 1
  15. testWhileIdle=true
  16. testOnBorrow=false
  17. testOnReturn=false
  18. poolPreparedStatements=false
  19. maxPoolPreparedStatementPerConnectionSize=200

要是还不能解决,可以重启idea便可解决。

再次运行

dbf89dd5c1a2455b935e04c217fa059b.png

信息: {dataSource-1} inited

这是日志信息,没有错,Druid采用了日志打印机制,这不是报错;

连接池采用了懒加载,真正用到的时候才初始化;

附上一些名词解释;

validationQuery = “SELECT 1” 验证连接是否可用,使用的SQL语句

testWhileIdle = “true” 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.

testOnBorrow = “false” 借出连接时不要测试,否则很影响性能

timeBetweenEvictionRunsMillis = “30000” 每30秒运行一次空闲连接回收器

minEvictableIdleTimeMillis = “1800000” 池中的连接空闲30分钟后被回收,默认值就是30分钟。

numTestsPerEvictionRun=”3” 在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值就是3.

解释:

配置timeBetweenEvictionRunsMillis = “30000”后,每30秒运行一次空闲连接回收器(独立线程)。并每次检查3个连接,如果连接空闲时间超过30分钟就销毁。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接,维护数量不少于minIdle,过行了新老更替。

testWhileIdle = “true” 表示每30秒,取出3条连接,使用validationQuery = “SELECT 1” 中的SQL进行测试 ,测试不成功就销毁连接。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接。

testOnBorrow = “false” 一定要配置,因为它的默认值是true。false表示每次从连接池中取出连接时,不需要执行validationQuery = “SELECT 1” 中的SQL进行测试。若配置为true,对性能有非常大的影响,性能会下降7-10倍。所在一定要配置为false.

每30秒,取出numTestsPerEvictionRun条连接(本例是3,也是默认值),发出”SELECT 1” SQL语句进行测试 ,测试过的连接不算是“被使用”了,还算是空闲的。连接空闲30分钟后会被销毁

原文链接:https://blog.csdn.net/weixin\_42323802/article/details/82726267

后来我又尝试只加一句 validationQuery = “SELECT 1”

发现问题也解决了,如下图:

f9d98f1e1df64463a50f8ea6eddd8b27.png

发表评论

表情:
评论列表 (有 0 条评论,171人围观)

还没有评论,来说两句吧...

相关阅读