我使用的框架是Struts2+Hibernate3+Spring,項目的后台數據庫是Mysql,最近挪到正式服務器上了,處於一直打開服務的狀態,就出現了java.net.SocketException: Software causedconnection abort: socket write error 這個異常。每次白天重啟后能夠正常訪問,晚上沒有人訪問后,第二天早上再訪問就報了這個錯誤。
在網上google了一下,都說是因為Mysql服務器默認的“wait_timeout”是8小時,也就是說一個connection空閑如果超過8個小時,Mysql將自動斷開該connection。這樣就出現了上面這個問題。
網上的解決方法有幾種:
第一種:在mysql安裝目錄下找到my.ini文件中添加超時限制:在該文件最后添加一行:wait_timeout=2880000。這樣把之前的超時限制把8小時(28800)擴大為20天(20*24*60*60=1728000)。這樣重啟了mysql后,再在其中輸入命令:show global variables like "wait_timeout"; ,查看超時是否已修改為:1728000。實際操作中,我修改的是C:\WINDOWS目錄下的my.ini,這是我的Mysql數據庫所使用的描述文件,在該文件的[mysqld]一節中,添加了wait_timeout=1728000。重啟mysql后,執行上面的查詢,返回的查詢結果如下:
mysql> show global variables like "wait_timeout"; +---------------+-------------+ | Variable_name | Value | +---------------+-------------+ | wait_timeout | 1728000 | +---------------+-------------+ 1 row in set (0.00 sec)
最后,重啟tomcat,OK,服務器能正常訪問。
第二種,通過c3p0的idleConnectionTestPeriod來控制:可以將它的值設定的比Mysql的默認wait_timeout小就行了。
<property name="idleConnectionTestPeriod" value="18000"/>
使用連接池可以解決這個問題,這里使用c3p0:
修改hibernate.cfg.xml文件
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">8</property>
<property name="hibernate.c3p0.max_size">200</property>
<property name="hibernate.c3p0.timeout">600</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.idle_test_period">60</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>