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?

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