最近做了一个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>