Tomcat 過一段時間就無法連上 MySQL 的問題

這幾天遇到一個很奇怪的現象, 就是 Tomcat Server 聯結資料庫, 經過八個小時候, 就再也連不上了;
問題是: 重新 連結一次以後又再度可以維持八個小時, ….這很奇怪!!…
去檢查了 log 檔案, 其中紀錄了 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
很明顯是 資料庫和客戶端的連線出問題了,
 
經過一陣努力之後, 終於搞清楚這到底是怎麼一回事了:
發生的原因, 只因為 Web Server 中的 Connection Pool 不知道 連線已經被 MySQL Server 單方面收回了,
因此: Web Server 的 Connection Pool 一直以為 那個連線還是活著的,
於是一用之後就立刻發生問題….
 
解決方法: 有三種方式, 任選一種都可以解決掉這個問題!…
簡單的邏輯想法就是 :  讓 Connection Pool 連線, 比 MySQL Server 回收時間短, 這樣就可以了….
1. 將 MySQL Server 的設定 timeout 時間拉到最大, 也就是說一但連線,  幾乎不會主動斷線,
   請設定 my.ini 或是 my.cnf 加入
   wait_timeout=2147483
   interactive_timeout=2147483
2. 讓 Web Server 的 Connection Pool Timeout 的時間縮短, 也就是說: 在MySQL 還沒來的及回收前,
   就讓 Connection Pool 放棄不要用; 這部分比較麻煩, 基本上是依據個人的使用 Connection Pool 不同來設定的,
   我使用的是 C3P0…
   2-1 如果使用 JDBC 連線, 那麼可以設定  <property name="hibernate.c3p0.timeout"  value="300"/>
   2-2 如果使用 Tomcat 的 JNDI 連線, 那麼可以
    <Resource name="jdbc/MySqlDS" jdbcUrl="jdbc:mysql://localhost:3306/test?autoReconnect=true" user="username" password="password"
        auth="Container" description="DB Connection" maxPoolSize="4" minPoolSize="2" acquireIncrement="1" maxIdleTime="300"
        driverClass="com.mysql.jdbc.Driver" factory="org.apache.naming.factory.BeanFactory" type="com.mchange.v2.c3p0.ComboPooledDataSource" />
   2-3 如果使用 JBoss 的連線, 可以設定:  ( JBoss 內建 Hibernate  )
        <min-pool-size>5</min-pool-size>
        <max-pool-size>20</max-pool-size>
        <idle-timeout-minutes>5</idle-timeout-minutes>
3. 第三種方法 當然就是 每次要連線時就使用" SELECT * FROM test " 指令連結一下,
    不過這樣的方法當然是很耗資源與時間的….
 
 
廣告

About fenjj

Perfect !!??...
本篇發表於 Uncategorized。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s