mysql数据库连接超过8小时失效的解决方案(springboot)

最近由于业务需要,开发了一个考勤服务,昨天部署上去,当时测试业务OK,今天早上发现考勤无法正常上传服务器。 后台日志显示数据库连接不上。

使用IDE连接数据库正常,服务确显示链接超时。
查看错误日志,发现了如下的日志:

经查发现原来是mysql默认会将8个小时内没有操作过的数据库连接断开。

解决方法:

1)设置Mysql链接超时时间

mysql数据库有一个wait_timeout的配置,默认值为28800(即8小时).

在默认配置不改变的情况下,如果连续8小时内都没有访问数据库的操作,再次访问mysql数据库的时候,mysql数据库会拒绝访问。

查看超时时间:
show variables like  ‘%timeout%’;
闲置连接的超时时间由wait_timeout控制、默认8小时。

解决方案:

第一种途径使用命令行在mysql提示符下

>set  global wait_timeout=1814400
这种方式是一种临时方法,重启服务就会返回默认值了。

第二种途径修改my.ini配置文件

[mysqld]
wait_timeout=31536000
interactive_timeout=31536000 

在mysqld下面添加以上两行,后面的数字是时间

重启服务

2:代码服务中设置数据源超时检测

在application.yaml中设置datasource的时候,加入如下设置:

      #验证连接的有效性
      test-while-idle: true 
      #获取连接时候验证,会影响性能
      test-on-borrow: true
      #在连接归还到连接池时是否测试该连接
      secondary.test-on-return: false
      validation-query: SELECT 1 FROM DUAL
      #空闲连接回收的时间间隔,与test-while-idle一起使用,设置5分钟
      time-between-eviction-runs-millis: 300000
      #连接池空闲连接的有效时间 ,设置30分钟
      min-evictable-idle-time-millis: 600000
      initial-size: 5
      #指定连接池中最大的活跃连接数.
      max-active: 50
      #指定连接池等待连接返回的最大等待时间,毫秒单位.
      max-wait: 60000
      #指定必须保持连接的最小值
      min-idle: 5

它的作用就是会每隔一段时间向mysql进行一次连接可用确认。

测试:

  1. 将mysql的默认时间改为60s,方便测试。(这俩都设置)
set global interactive_timeout=60;
set global wait_timeout=60;
  1. 不设置上面的自动连接确认,隔两分钟请求测试接口。
    第一次请求正常,第二次请求又报上面的错误。
  2. 设置自动连接确认,隔两分钟请求测试接口。
    多次请求均正常。

也可以将上面两个参数设置大一些,比如一年等。需要注意这俩参数的作用级别是“数据库实例”。注意对其他库的影响。

发表评论

电子邮件地址不会被公开。 必填项已用*标注