java web项目长时间没有请求与mysql的连接断开,服务器报500错误


这段时间发现自己之做的一个微信端项目出现了一个bug,就是偶尔进入微信页面时会报500错误,说jdbc 连接异常,不能够进行事务操作。。。


而刷新一下就好了,,,于是猜想是因为项目长时间没有http请求,与数据库的连接被断开了,,然后刷新一下就又连接上了。。


经查询资料得知,mysql有一个连接超时时间的概念。。。查询此项目的数据库的连接超时时间为28800秒,即为8小时。。


mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set

于是不难得知,肯定是由于项目长时间没有请求数据库,数据库过了8小时和这个连接超时时间之后,就会断开连接。。


而我们的项目使用的是c3p0的连接池,,过了8小时后,连接池中的连接已经被mysql断开了,即连接失效。。但是c3p0认为此连接却依然有效,此时当我们发请求请求数据库中的数据时,由于连接失效,并不能去连接数据库操纵数据,所以服务器会抛出一个500的错误。。


问题的原因已经找到,那我们该怎么解决呢??

其实解决起来很简单的。。


先说第一种办法吧,就是将数据库的连接超时时间设置大一点,

msyql> set global wait_timeout=1814400;
msyql> set global interactive_timeout=1814400;
当然这种办法我并不推荐,,这个办法不太好,弊端太多了。。比如占用数据库资源,关键是这种办法并不能彻底根治mysql连接断开这种情况
所以我推荐第二种办法,,设置c3p0隔多少时间自动检测与数据库的连接,如果断开则自动重连
	<bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
	//下面两个属性就是设置c3p0隔28800秒自动检测与数据库的连接(28800也是mysql的默认的连接超时时间)
		<property name="testConnectionOnCheckin" value="true"></property>
		<property name="idleConnectionTestPeriod" value="28800"></property>
	</bean>




猜你喜欢

转载自blog.csdn.net/qq_29992111/article/details/78958505