1. 程式人生 > >Tomcat+MySQL應用中連線超時造成各種異常情況的處理

Tomcat+MySQL應用中連線超時造成各種異常情況的處理

     用Tomcat+Mysql+Spring+Hibernate作了一個小應用,結果投入使用的時候,發現每過一天,就必須重啟動Tomcat,我跟蹤Tomcat日誌,發現是Mysql連線被拒絕

    嘗試了N種方法,換為Tomcat的連線池連線,調整Jdbc連線串的引數,加入C0p3連線池引數多種方法.

    最後發現必須幾種處理方式都加上,才能夠正常的處理

    1.改用Tomcat連線池連線
<Resource name="jdbc/oapool"   auth="Container"  type="javax.sql.DataSource" />

<ResourceParams name="jdbc/oapool" >
  <parameter>
   <name>factory</name>
   <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
  </parameter>

  <parameter>
   <name>removeAbandoned</name>
   <value>true</value>
  </parameter>

<parameter>
<name>removeAbandonedTimeout</name>
<value>0</value>
</parameter>

<parameter>
<name>logAbandoned</name>
<value>false</value>
</parameter>

<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>

<parameter>
<name>maxIdle</name>
<value>5</value>
</parameter>

<parameter>
<name>maxWait</name>
<value>1800</value>
</parameter>

<parameter>
<name>username</name>
<value>admin</value>
</parameter>

<parameter>
<name>password</name>
<value>123</value>
</parameter>

<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>

<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/oa?useUnicode=true&amp;characterEncoding=GB2312</value>
</parameter>

</ResourceParams>

    2.在JDBC連線串中加入AutoReconnect=True

    3.在Hibernate配置檔案中加入C0p3連線池引數
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">30</property>
<property name="c3p0.time_out">0</property>
<property name="c3p0.max_statement">50</property>
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.idle_test_period">0</property>
<property name="c3p0.validate">true</property>

    4.在MySQL.ini檔案中,加入Wait-Time引數
     wait-timeout =2400

全部處理後,終於完全正常了,連之前,反覆請求,就出現異常的情況也沒有了

相對來說,還是商業資料庫要好點,就算最差的MSSQL也沒有這類問題,更別說DB2,Oracle了

當然,成本的降低意味這要更費精力,這也很正常.....

另外Tomcat刷出的動態 JSP頁面裡面,特別是沒用裝飾器的情況

如果頁面內部有中文時,往往只顯示了部分的頁面到客戶端

開始採用的辦法是,往頁面裡面加入一些空格,空格數量保證大於 中文數字*2就可以了

後來研究發現,使用SiteMesh裝飾器就可以解決這個問題,建立一個裝飾器,裡面不要直接有中文,中文用fmt標籤代替.

再在所有的頁面裡面套個裝飾器,就可以正常輸出了,估計Tomcat在向客戶端返回是會計算需要的緩衝區,而中文可能是6個位元組的,Tomcat在某些情況下認為是4個位元組,所以每個中文少兩個位元組

而使用裝飾器後,組合輸出的過程可能有裝飾器進行了某種處理,保證頭尾都是裝飾的內容,中文的部分也就是我們的頁面的緩衝計算也不由Tomcat管理了

其實,這個問題,很可能就是裝飾器造成的,不用裝飾器的應用,好像沒處這個問題

應該是,SiteMesh 設定的包裝頁,用的編碼是 UTF-8,其字元計數是6個位元組一個字元,而內部的內容頁,可能用的ANSI(GBK)做的內容頁,其字元計數是4個位元組一個字元,這樣其想客戶端輸出時,Servlet按包裝也的UTF-8編碼的字元計數方法,計算了內容頁的內容,所以總字數就少了接近1/3,比較了缺少的字元數,從側面說明了這一點

如果SITEMESH 包裝頁 和內容頁編碼一致,這個問題就不會出現了

還有一種可能的情況,就是INCLUDE JSP頁面的  pageEncoding 引數指定得不一致

這在Weblogic裡面基本不會出現,它不允許出現多個@Page,只會在Tomcat下發生

解決的方法:

1.將頁面的 pageEncoding改成一致的

2.使用 <jsp:include 代替 inlcude