Mysql 8小时内无请求自动断开连接解决方法
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在,在Hibernate默认连接池中的connections如果空闲超过8小时,Mysql将其断开,而Hibernate默认连接池并不知道该connection已经失效,如果这时有 Client请求connection,Hibernate默认连接池将该失效的Connection提供给Client,将会造成上面的异常。
root@mysqldb 10:42: [(none)]> show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 10 |
| innodb_rollback_on_timeout | ON |
| interactive_timeout | 600 |
| lock_wait_timeout | 3600 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 600 |
+-----------------------------+----------+
13 rows in set (0.00 sec)
wait_timeout和interactive_timeout默认值是28800也就是8小时,最大值只允许2147483(24天左右)
高并发请求下wait_timeout参数不宜设置太大,会造成堵塞;
解决办法:
user.datasource.url=jdbc:mysql://clcdbm1:3307/bazhong_user?serverTimezone=UTC&useUnicode=true&autoReconnect=true&failOverReadOnly=false&preferredTestQuery=select now()
既增加autoReconnect和failOverReadOnly、preferredTestQuery三个参数
Mysql JDBC URL连接常见参数表:
参数名称 参数说明 缺省值 最低版本要求
user 数据库用户名(用于连接数据库) 所有版本
password 用户密码(用于连接数据库) 所有版本
useUnicode 是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true false 1.1g
characterEncoding 当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk false 1.1g
autoReconnect 当数据库连接异常中断时,是否自动重新连接? false 1.1
autoReconnectForPools 是否使用针对数据库连接池的重连策略 false 3.1.3
failOverReadOnly 自动重连成功后,连接是否设置为只读? true 3.0.12
maxReconnects autoReconnect设置为true时,重试连接的次数 3 1.1
initialTimeout autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒 2 1.1
connectTimeout 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本 0 3.0.1
socketTimeout socket操作(读写)超时,单位:毫秒。 0表示永不超时
preferredTestQuery 用于检测数据库连接测试,检测数据库是否能连接成功,后面可以直接跟sql语句
Tag标签:「mysql wait_timeout 请求 自动」更新时间:「2021-11-03 14:23:19」阅读次数:「831」