“java.sql.SQLException
MESSAGE: Communication link failure: java.net.SocketException, underlying cause: Software caused connection abort: recv failed”.
上網(wǎng)查了些帖子,發(fā)現(xiàn)可能是MySQL5.0版本的一個(gè)bug:超時(shí)問題。MySQL默認(rèn)等待時(shí)間間隔wait_timeout是8小時(shí),也就是8小時(shí)內(nèi),我們的系統(tǒng)沒有使用,沒有對(duì)數(shù)據(jù)庫進(jìn)行訪問的話,數(shù)據(jù)庫會(huì)關(guān)閉連接,而當(dāng)我們系統(tǒng)用這些連接對(duì)數(shù)據(jù)庫進(jìn)行訪問時(shí),就會(huì)出現(xiàn)上述問題。
解決辦法有2種:
1. 對(duì)于MySQL5之前的版本,如Mysql4.x,只需要修改連接池配置中的URL,添加一個(gè)參數(shù):autoReconnect=true,如果是MySQL5及以后的版本,則需要修改my.ini文件。在[mysqld]后面添加上: wait_timeout=1814400,把默認(rèn)的8小時(shí)盡量延長(zhǎng)。
2. 采用第三方的數(shù)據(jù)庫連接池來管理連接, 如,proxool、C3P0等。性能方面據(jù)說proxool更強(qiáng)些。由于該系統(tǒng)用了hibernate,對(duì)C3P0支持比較好,C3P0.jar包無需另外下載。C3P0和hibernate的配置也相對(duì)簡(jiǎn)單,如下,
先把C3P0.jar包拷貝到WEB-INF\lib下,然后修改hibernate.cfg.xml文件,加入以下內(nèi)容:
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">false</property>
這樣基本可以解決MySQL的超時(shí)問題,如何檢查該方法是否有效呢?可以通過修改服務(wù)器的系統(tǒng)日期,把日期往前推幾個(gè)月,然后再訪問系統(tǒng),看是否還報(bào)錯(cuò)。