致访客
感谢各位一年多的陪伴,因内容调整,本站将于近日迁移到新域名并不再更新主要内容。

MENU

解决MySQL与c3p0的8小时丢连接问题

• March 16, 2020 • Java

致访客
感谢各位一年多的陪伴,因内容调整,本站将于近日迁移到新域名并不再更新主要内容。
特此通知。

问题概述

开发的一个内部系统在测试服务器上跑了一个礼拜,发现有时候系统长时间闲置后登录会出现错误,报错主要内容如下:

The last packet successfully received from the server was XXX milliseconds ago. The last packet sent successfully...

但返回登录页面再次尝试登录就不会报错,经过复现后发现是因为c3p0与MySQL存在8小时丢连接的问题。

解决方案

管理员要求不对数据库服务器的配置进行修改,所以只能修改c3p0配置文件。

jdbc.properties

#c3p0反空闲设置,防止8小时失效问题28800
#idleConnectionTestPeriod要小于MySQL的wait_timeout
jdbc.c3p0.testConnectionOnCheckout=false
jdbc.c3p0.testConnectionOnCheckin=true
#向mysql发包测试存活的间隔(秒)
jdbc.c3p0.idleConnectionTestPeriod=30
jdbc.c3p0.maxIdleTime=3600

spring-mybatis.xml

<!-- 数据库连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <!-- 其他配置项省略 -->
    <property name="testConnectionOnCheckin" value="${jdbc.c3p0.testConnectionOnCheckin}"/>
    <property name="testConnectionOnCheckout" value="${jdbc.c3p0.testConnectionOnCheckout}"/>
    <property name="idleConnectionTestPeriod" value="${jdbc.c3p0.idleConnectionTestPeriod}"/>
    <property name="maxIdleTime" value="${jdbc.c3p0.maxIdleTime}"/>
</bean>
Last Modified: June 20, 2020