MySQl的默认连接时长为8个小时,如果超过8个小时连接而没有对数据库的操作的话就会断开,此时再访问会报错
java.io.EOFException
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
...
这个问题在不同的MySQL版本可以有着不同的解决方案
例如在MySQL5之前可以在数据库连接的url中加入“autoReconnect=true” (这仅对mysql5之前有作用)也可以更改MySQL的配置文件将默认的8个小时更改为更长的时间,这里不再介绍
在这里介绍使用MyBatis+C3P0数据库连接池来解决这个问题
首先在pom.xml中引入C3P0
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
更改MyBatis的配置文件
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="MyBatisDao.C3P0DataSourceFactory">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 初始大小-->
<property name="initialPoolSize" value="5"/>
<!-- 最大连接-->
<property name="maxPoolSize" value="20"/>
<!-- 最小连接-->
<property name="minPoolSize" value="5"/>
<!-- 连接池内连接生存周期-->
<property name="maxIdleTime" value="1800"/>
</dataSource>
</environment>
</environments>
注意MyBatis配置文件中的dataSource(数据源)属性的设置为下面的类文件
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
/**
* 创建C3P0与MyBatis兼容的数据源工厂类
*/
public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
public C3P0DataSourceFactory() {
this.dataSource = new ComboPooledDataSource();
}
}
至此,就解决了MyBatis连接数据库超过8小时自动断开的问题