SpringMVC+MyBatis构建JavaWEB项目长时间空置后数据库操作报错

198 阅读1分钟

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>

image.png

注意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小时自动断开的问题