MySQL8小时连接超时断开问题

报错:

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 66,313,166 milliseconds ago. The last packet sent successfully to the server was 66,313,166 milliseconds ago. is longer than the server configured value of ‘wait_timeout’. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property ‘autoReconnect=true’ to avoid this problem.
原因:

MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0 连接池则以为该被断开的连接依然有效。在这种情况下,如果客户端代码向 c3p0 连接池请求连接的话,连接池就会把已经失效的连接返回给客户端,客户端在使用该失效连接的时候即抛出异常

解决方法

方法一:在jdbc连接url的配置中,添加“autoReconnect=true”,但这仅对myslq5以前的版本起作用

方法二:修改MySQL配置,MySQL服务器默认的“wait_timeout”是28800秒即8小时,调大“wait_timeout”的值,但最大只允许2147483 (24天左右),但不建议。

show variables like "%timeout%"
set interactive_timeout=2147483
set wait_timeout=2147483

 方法三:配置连接池(建议通过修改配置解决)

type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver" JDBC驱动类
url=""
username="" 访问数据库用户名
password="" 访问数据库的密码
maxActive="80" 最大活动连接
initialSize="10"  初始化连接
maxIdle="60"   最大空闲连接
minIdle="10"   最小空闲连接
maxWait="3000" 从池中取连接的最大等待时间,单位ms.
validationQuery = "SELECT 1"  验证使用的SQL语句(如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用)
testWhileIdle = "true"      指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.
testOnReturn = “false”  归还连接时执行validationQuery检测连接是否有效,true做了这个配置会降低性能。
testOnBorrow = "false"   借出连接时不要测试,否则很影响性能。
timeBetweenEvictionRunsMillis = "30000"  每30秒运行一次空闲连接回收器
minEvictableIdleTimeMillis = "1800000"  池中的连接空闲30分钟后被回收
numTestsPerEvictionRun="3" 在每次空闲连接回收器线程(如果有)运行时检查的连接数量
removeAbandoned="true"  连接泄漏回收参数,当可用连接数少于3个时才执行
removeAbandonedTimeout="180"  连接泄漏回收参数,180秒,泄露的连接可以被删除的超时值

你可能感兴趣的:(开发踩过的坑,数据库,数据库,servlet,mysql)