JDBC连接MySQL错误分析

最近有反应在使用JDBC连接MySQL数据库时偶尔会报以下的错误信息:

  The last packet successfully received from the server was 2,999,795 milliseconds ago. The last packet sent successfully to the server was 2,999,797 milliseconds ago. 

 原因分析:

  产生这个错误的原因是:使用jdbc池连接数据库时会保留指定的连接数(这个数字由initialSize,maxIdle这两个参数决定),之后有程序需要连接数据库做操作时,就从连接池中直接获取,提高效率,但是MySQL中有两个针对空闲连接的参数设置(wait_timeout,interactive_timeout),这两个参数默认设置是8小时,也就是说如果一个连接空闲了8小时,那么数据库认为这个连接是没人使用的,于是将它强制关闭,而此时jdbc还认为这个连接是存在的,之后程序获取连接时,jdbc仍然使用这个连接执行程序中的SQL,就报错了。

解决方案:

可以通过以下三种方式去解决这个问题

1)将jdbc连接池中initialSize,maxIdle两个参数都设置得小一些,建议将initialSize设为5,maxIdle设为10,这两个参数含义分别是:初使化连接数,最大空闲连接数,设小后我们的连接池中空闲的连接数更少,这样每个连接被使用的频率更高,从而各个连接的空闲时间会越短,最终会低于8小时而避免了这个错误。(随着将来系统访问量、访问频率的增加,我们可以重新加大这两个参数的设置),这种方式简单、改动量小、影响范围小,推荐首先采用这种方式解决。

2)调大MySQL数据库wait_timeout,interactive_timeout这两个参数值,例如调至15小时,这样只要在15小时内该连接有执行过事务,就不会发生这种错误,减少这个错误发生的概率,这种方式需要重启MySQL数据库,影响较大,建议后期先通过测试环境验证后在生产环境执行。

3)使用dbcp连接池,dbcp连接池有丰富的连接设置,设置validationQuery,每次拿到连接时去执行一条验证SQL来测试该连接是否可用。如:

greenline.rms.mysql.validationQuery=SELECT 1

猜你喜欢

转载自blog.csdn.net/qq_44696532/article/details/134592932