长时间不访问服务器程序,与数据库连接断开,报错(mysql+struts2+hibernate)(求解)...

项目部署到服务器上,一晚上没访问,第二天点击菜单报错:

 

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 

 

<property name="driverClass"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="jdbcUrl"> <value>jdbc:oracle:thin:@10.2.28.30:1521:ora92</value> </property> <property name="properties"> <props> <prop key="c3p0.acquire_increment">2</prop> <prop key="c3p0.idle_test_period">200</prop> <prop key="c3p0.timeout">1000</prop> <prop key="c3p0.max_size">100</prop> <prop key="hibernate.c3p0.max_statements">100</prop> <prop key="hibernate.c3p0.min_size">20</prop> <prop key="user">bank</prop> <prop key="password">bank</prop> </props> </property>
 
  

 

 

 具体问题还未解决,解决后来完善此文

 

 

 

 

 

 

 

 

 

 注意:

hibernate.c3p0.timeout属性指定多少秒后连接超时,连接池会自动对超时连接进行重查。

hibernate内部自带c3p0的链接jar包,所以,在hbm.cfg.xml里直接配置如下项目即可:

c3p0-native property namehibernate configuration key
c3p0.acquireIncrementhibernate.c3p0.acquire_increment
c3p0.idleConnectionTestPeriodhibernate.c3p0.idle_test_period
c3p0.initialPoolSizenot available -- uses minimum size
c3p0.maxIdleTimehibernate.c3p0.timeout
c3p0.maxPoolSizehibernate.c3p0.max_size
c3p0.maxStatementshibernate.c3p0.max_statements
c3p0.minPoolSizehibernate.c3p0.min_size

 但是hibernate内部没有proxml的,所以如果使用此作为数据库链接池,那么就要引入jar包,和单独的pro的配置文件

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值