关于MySQL wait_timeout问题记录

问题描述

之前有遇到过MySQL wait_timeout超时问题,主要是因为在使用数据库连接池时,获取到的连接空闲时长由于超过了wait_timeout设置的时间,导致该连接被MySQL服务端释放掉了,最终在使用时产生报错现象。

wait_timeout

先了解下MySQL中的wait_timeout参数

在这里插入图片描述
官网文档中对于wait_timeout参数的一些相关属性已经给出了明确的说明,首先可以看到wait_timeout的默认值是28800秒,也就是当连接空闲时长超过8小时就会自动断开,在非windows环境下,最大可以设置31536000秒,等于365天。

修改wait_timeout默认值

如果你需要修改wait_timeout的时间,可以使用

set wait_timeout = 28800;

也可以修改my.cnf配置,不过我们在上图中可以看到,wait_timeout的作用域有两种,一种是session级别,一种是global级别,而刚才这两种方式的作用域都是session级别的,当服务重启后就会失效,所以要想设置global永久级别的需要通过如下方式执行

set GLOBAL wait_timeout = 28800;

数据库连接池

除了通过修改wait_timeout配置外,一般还是通过合理的配置数据库连接池参数来避免wait_timeout的问题,比如以druid连接池为例(其他连接池也是类似的),可以使用如下配置。

spring.datasource.validationQuery=SELECT 1
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=1800000

这段配置的含义如下:当testWhileIdle为true(默认true),应用向连接池申请连接并且testOnBorrow为false时,连接池将会判断取出的连接是否处于空闲状态,如果是,则使用SELECT 1验证这条连接是否可用,对于连接是否处于空闲状态则通过timeBetweenEvictionRunsMillis参数为依据,如果空闲时间超过timeBetweenEvictionRunsMillis设置的值(默认1分钟),则会验证一下连接有效性,如果空闲时间超过了minEvictableIdleTimeMillis的值(默认30分钟),则会直接剔除。

通过验证连接有效性的方式,避免了从连接池中获取了已经被MySQL服务端释放掉的连接。

猜你喜欢

转载自blog.csdn.net/CSDN_WYL2016/article/details/110731108
今日推荐