最近做了一个SSH整合小项目,部署后发现当app长时间空闲时,tomcat会抛出链接超时异常,简单查了下原因,发现是MySQL将8小时内未使用过的链接释放,但是web容器认为链接依然存在,造成链接超时的问题。

解决方案:

 

1、调整MySQL系统变量 wait_time

 

尝试修改了my.ini中的系统变量,将链接保持时间由8小时改为21天(MySQL最多能识别出21天的时间)。程序不再抛出异常,但发现服务器负载过大,原因是MySQL保持了许多闲置的链接,造成服务器内存不足。故不能采用修改系统变量的解决方案。

 

2、修改Hibernate连接池配置

 

Hibernate官方文档中不建议使用默认连接池,默认连接池应仅供测试使用,生产项目应采用C3P0连接池。

在Spring配置文件中修改(注意property和bean的属性与默认连接池的区别)


 


<bean id="dataSource"
  class="com.mchange.v2.c3p0.ComboPooledDataSource"
  destroy-method="close">
  <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
  <property name="jdbcUrl" value="jdbc:url"></property>
  <property name="user" value="username"></property>
  <property name="password" value="password"></property>
  <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 1 --> 
  <property name="acquireIncrement"
   value="1">
  </property>
  <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 
  <property name="initialPoolSize"
   value="3">
  </property>
  <!--最大空闲时间,30秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> 
  <property name="maxIdleTime" value="30"></property>
  <!--连接池中保留的最大连接数。Default: 15 --> 
  <property name="maxPoolSize" value="15"></property>
  <!--连接池中保留的最小连接数。Default: 3 --> 
  <property name="minPoolSize" value="3"></property>
  <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
  <property name="acquireRetryDelay" value="1000"></property>
  <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> 
  <property name="acquireRetryAttempts" value="60"></property>
  <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 
  保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 
  获取连接失败后该数据源将申明已断开并永久关闭。Default: false--> 
  
  <property name="breakAfterAcquireFailure" value="false"></property>
 </bean>