项目部署到服务器上,一晚上没访问,第二天点击菜单报错:
exception
org.hibernate.exception.JDBCConnectionException: could not execute query
root cause
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 54,313,344 milliseconds ago. The last packet sent successfully to the server was 54,313,344 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.
root cause
java.net.SocketException: Software caused connection abort: socket write error
报错原因:
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。而hibernate获取连接的时候认为连接池里的这个连接还是有效的,所以就拿来使用,这时候就报错了。
在 Mysql控制台下输入 SHOW VARIABLES;
最后一个参数
wait_timeout 28800
如果单位是秒,也就是 8 个小时。
程序最后一次建立连接完毕之后 8 个小时,
Mysql 单方面关闭了这个连接。
但 Hibernate 还在记忆着这个连接基本信息。
程序再次连接的时候,已经不存在了。
网上搜罗来的解决方案:
1、
在mysql安装目录下找到my.ini文件中添加超时限制:在该文件最后添加一行:wait_timeout=2880000。这样把之前的超时限制把8小时(28800)扩大为800小时。这样重启了mysql后再在其中输入命令:show global variables like "wait_timeout";查看超时是否已修改为:2880000。重启tomcat(如果已启动),OK。
2.使用hibernate配置c3p0
具体问题还未解决,解决后来完善此文
注意:
hibernate.c3p0.timeout属性指定多少秒后连接超时,连接池会自动对超时连接进行重查。
hibernate内部自带c3p0的链接jar包,所以,在hbm.cfg.xml里直接配置如下项目即可:
c3p0-native property name | hibernate configuration key |
---|---|
c3p0.acquireIncrement | hibernate.c3p0.acquire_increment |
c3p0.idleConnectionTestPeriod | hibernate.c3p0.idle_test_period |
c3p0.initialPoolSize | not available -- uses minimum size |
c3p0.maxIdleTime | hibernate.c3p0.timeout |
c3p0.maxPoolSize | hibernate.c3p0.max_size |
c3p0.maxStatements | hibernate.c3p0.max_statements |
c3p0.minPoolSize | hibernate.c3p0.min_size |
但是hibernate内部没有proxml的,所以如果使用此作为数据库链接池,那么就要引入jar包,和单独的pro的配置文件