一個都起灰塵的項目,最近出現一個問題。描述如下:當天使用很正常,到了第二天就不能登錄使用,具體的說不能訪問數據庫。重啟“小貓”之后,能正常使用,但到第二天又不行啦。根據日志分析,是MySQL數據庫連接關閉了。
“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文件,加入以下內容:
<!--C3P0 setting-->
<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的超時問題,如何檢查該方法是否有效呢?可以通過修改服務器的系統日期,把日期往前推幾個月,然后再訪問系統,看是否還報錯。
posted on 2009-06-22 14:56
matthew 閱讀(935)
評論(0) 編輯 收藏 所屬分類:
數據庫(Sql server,My sql)