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

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>

原文:https://blog.csdn.net/qq_29992111/article/details/78958505

猜你喜欢

转载自blog.csdn.net/yangfengjueqi/article/details/81355790