JDBC连接超时问题

这两天遇到一个问题,早上来了登录我们的项目网站第一次登录总是登不上去,第二次就好了,我看了一下后台的报错信息是这样的:

The last packet successfully received from the server was 57,704,088
milliseconds ago. The last packet sent successfully to the server was
57,704,089 milliseconds ago. is longer than the server configured
value of ‘wait_timeout’. You should consider either expiring and/or
testing connection validity before use in your application, increasing
the server configured values for client timeouts, or using the
Connector/J connection property ‘autoReconnect=true’ to avoid this
problem.

大体意思是说上次成功接收报文的时间超过了数据库超时时间的值,为了解决这个问题,应当增加数据库的超时时间或者是启用数据库自动重连机制。所以我们可以用两种方法:
1、从DB层解决问题:增大数据库连接超时时间
2、从应用层解决问题:设置自动重连机制,即在一定时间之内与数据库重连一次

1 增大数据库连接超时时间

数据库的超时时间是指一个连接可空闲的最大时间,如超时时间是30分钟,则如果一个连接空闲了30分钟,那么该连接将断开。

我这里是MySql数据库,首先使用下面命令查询数据库超时时间大小:

SHOW  GLOBAL  VARIABLES LIKE  'wait_timeout';

显示结果如下:

这里写图片描述

这个是MySql设置的默认值,这里单位是秒,28800秒就是8小时。

想要重新设置超时时间可以用以下命令:

SET GLOBAL wait_timeout=28800;

但是数据库的连接超时时间不能设置太长,时间过长,导致过多的connection Sleep,占用较多系统资源。所以理论上虽然可以将超时时间设置的更大,但强列不推荐用这种方法。看一下第二种办法。

2 启用自动重连机制

自动重连机制是说应用隔一段时间,比如说一小时就向数据库发送一条简单sql,比如“select 1”,以向数据库证明我还活着,我项目里连接数据库使用的最常见是DBCP连接池,具体配置如下:

    <bean id="dataSourceOracle" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.oracle.driverClassName}" />
        <property name="url" value="${jdbc.oracle.url}" />
        <property name="username" value="${jdbc.oracle.username}" />
        <property name="password" value="${jdbc.oracle.password}" />
        <!-- 初始化连接数 -->
        <property name="initialSize" value="1" />
        <!-- 最大活动连接数 -->
        <property name="maxActive" value="50" />
        <!-- 最大空闲连接数 -->
        <property name="maxIdle" value="5" />
        <!-- 最小空闲连接数 -->
        <property name="minIdle" value="15" />
        <!-- 检测SQL -->
        <property name="validationQuery" value="select 1" />
        <property name="testOnBorrow" value="false" />
        <!-- 定时对线程池中的链接进行validateObject校验 -->
        <property name="testWhileIdle" value="true" />
        <property name="testOnReturn" value="false" />
        <!-- 获取连接最大等待时间 -->
        <property name="maxWait" value="60000" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 空闲池中空闲连接能够被激活前的最小空闲时间(毫秒) -->
        <property name="minEvictableIdleTimeMillis" value="25200000" />
    </bean>

这里注意timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis的值要小于或等于数据库的连接超时时间。


Men were born to be suffering, the pain of struggle, or the pain of regret?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章