在项目中,偶尔会出现获取jdbc连接失败的报错 其中有一种因为连接失效的报错:
The last packet successfully received from the server was 1,312,227 milliseconds ago. The last packet sent successfully to the server was 1,312,266 milliseconds ago.
说明我们的程序首次获取数据的Connection资源,从而进行正常的DB读写操作。但是在下次进行DB读写时,应用程序还以为之前的连接可用,(之前的连接没有被释放掉),但实际上,这个连接在Mysql数据库那边已经过期了,(把这个连接标记为timeout了)。于是,就出现了上述报错
Mysql数据的对应参数为 可以通过命令查看:
show variables like '%timeout%'
查询结果: 参数的配置文件在:在/etc/my.cnf 可以根据自己实际需求设置
解决方案:
1.如果使用的是JDBC,在JDBC URL上添加?autoReconnect=true,如:
jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true
2.如果是在Spring中使用DBCP连接池,在定义datasource增加属性validationQuery和testOnBorrow,如:
<property name= "validationQuery" value= "SELECT 1" />
<property name= "testOnBorrow" value= "true"/>
3.如果是在Spring中使用c3p0连接池,则在定义datasource的时候,添加属性testConnectionOnCheckin和testConnectionOnCheckout,如:
<property name= "testConnectionOnCheckin" value= "false"/>
<property name= "testConnectionOnCheckout" value= "true"/>
|