最近项目中使用了c3p0作为连接池,遇到了mysql八小时连接废弃的问题,下面展示一下我的解决方案
configuration.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="C3P0DataSourceFactory">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" />
<property name="user" value="root" />
<property name="password" value="123" />
<property name="minPoolSize" value="5" />
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="20"/>
<!--初始化时获取十个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="10"/>
<!--最大空闲时间,36000秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="25000"/>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement" value="3"/>
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts" value="30"/>
<!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
<property name="acquireRetryDelay" value="1000"/>
<!--每18000秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="3600"/>
<!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出
SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
<property name="checkoutTimeout" value="3000"/>
<property name="testConnectionOnCheckout" value="false" />
<!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
<property name="testConnectionOnCheckin" value="true"/>
<property name="automaticTestTable" value="c3p0testtable"/>
<property name="connectionTesterClassName" value="C3p0ConnectTest"/>
</dataSource>
</environment>
</environments>
<mappers>
</mappers>
</configuration>
下面是用的到的类
C3P0DataSourceFactory.java
import java.util.Properties; import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0DataSourceFactory extends UnpooledDataSourceFactory { public C3P0DataSourceFactory() { this.dataSource = new ComboPooledDataSource(); } @Override public void setProperties(Properties arg0) { super.setProperties(arg0); } }
C3p0ConnectTest.java
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import com.mchange.v2.c3p0.impl.DefaultConnectionTester; /** * c3p0测试类 * @author siyunlong * @version 1.0 * @date 2013-8-20下午6:16:58 * */ public class C3p0ConnectTest extends DefaultConnectionTester{ @Override public int activeCheckConnection(Connection connection, String sql, Throwable[] arg2) { try { Statement s = connection.createStatement(); s.execute(sql); } catch (SQLException e) { System.out.println("测试connection有效性异常"); e.printStackTrace(); } return 0; } }