一:先贴上代码:
<!-- c3p0数据源及连接池配置 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${jdbc.system.driverClassName}"></property> <property name="jdbcUrl" value="${jdbc.system.url}"></property> <property name="user" value="${jdbc.system.username}"></property> <property name="password" value="${jdbc.system.password}"></property> <!-- 最小连接数 --> <property name="minPoolSize" value="5"></property> <!-- 最大连接数 --> <property name="maxPoolSize" value="335"></property> <!-- 初始化连接数 --> <property name="initialPoolSize" value="10"></property> <!-- 连接耗尽后,一次性获取的新连接数 --> <property name="acquireIncrement" value="5"></property> <!-- 连接失败后重复连接次数 --> <property name="acquireRetryAttempts" value="2"></property> <!-- 两次连接间隔时间1000*1毫秒(1秒) --> <property name="acquireRetryDelay" value="1000"></property> <!-- 每60*60秒(1小时),检查连接池中的空闲连接 --> <property name="idleConnectionTestPeriod" value="3600"></property> <!-- 最大空闲时间60*30秒(0.5小时),内不使用则丢弃 --> <property name="maxIdleTime" value="1800"></property> </bean>
二:进入mysql,type:
SHOW GLOBAL VARIABLES LIKE '%_timeout';
找到:A: interactive_timeout 28800 (8小时)
B: wait_timeout 28800
解释一下:
A: interactive_timeout:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。又见wait_timeout
B: wait_timeout:服务器关闭非交互连接之前等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局 interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义),又见interactive_timeout
总结:如此看来,两个变量是共同控制的,那么都必须对他们进行修改了 。继续深入这两个变量wait_timeout的取值范围是 1-2147483(Windows),1-31536000(linux),interactive_time取值随wait_timeout变动,它们的默认值都是28800
SHOW GLOBAL VARIABLES LIKE '%max';
找到:max_connections 335
三:找到%mysql_home%/my.ini,加入
wait_timeout=10
interactive_timeout=10
注:在my.ini中配置wait_timeout不起作用,则用如下方法
SET GLOBAL wait_timeout=120
SET GLOBAL interactive_timeout = 120
SHOW GLOBAL VARIABLES LIKE '%_timeout%'
如果重启mysql,则所有你刚才设置的GLOBAL数据都无效了.
然后重启mysql服务
四:检查并更改C3P0配置选项每60*60秒(1小时),检查连接池中的空闲连接
(1)idleConnectionTestPeriod(秒) 必须 < wait_timeout(秒) ----------很重要的配置
(2)maxIdleTime必须(秒) > wait_timeout(秒)
(3)maxPoolSize必须 < max_connections
五:ok
可以测试一下你的连接,是不是解决了mysql8小时的问题