java.net.SocketException: Software caused connection abort: socket write error


我使用的框架是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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM