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 " 指令連結一下,
不過這樣的方法當然是很耗資源與時間的....