“java.sql.SQLException
MESSAGE: Communication link failure: java.net.SocketException, underlying cause: Software caused connection abort: recv failed”.
上網查了些帖子,發現可能是MySQL5.0版本的一個bug:超時問題。MySQL默認等待時間間隔wait_timeout是8小時,也就是8小時內,我們的系統沒有使用,沒有對數據庫進行訪問的話,數據庫會關閉連接,而當我們系統用這些連接對數據庫進行訪問時,就會出現上述問題。
解決辦法有2種:
1. 對于MySQL5之前的版本,如Mysql4.x,只需要修改連接池配置中的URL,添加一個參數:autoReconnect=true,如果是MySQL5及以后的版本,則需要修改my.ini文件。在[mysqld]后面添加上: wait_timeout=1814400,把默認的8小時盡量延長。
2. 采用第三方的數據庫連接池來管理連接, 如,proxool、C3P0等。性能方面據說proxool更強些。由于該系統用了hibernate,對C3P0支持比較好,C3P0.jar包無需另外下載。C3P0和hibernate的配置也相對簡單,如下,
先把C3P0.jar包拷貝到WEB-INF\lib下,然后修改hibernate.cfg.xml文件,加入以下內容:
<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的超時問題,如何檢查該方法是否有效呢?可以通過修改服務器的系統日期,把日期往前推幾個月,然后再訪問系統,看是否還報錯。