1. 程式人生 > >c3p0+mysql連線池超時問題

c3p0+mysql連線池超時問題

java.sql.SQLException: Communications link failure

今天發現一個非常有趣的問題,當應用啟動之後,如果在一段時間內沒有任何操作,當再次操作的時候就會報一個Communications link failure異常,這個問題是什麼原因造成的呢?下面我來分析一下原因:

首先我們要看看mysql以及c3p0連線池中對於連線超時屬性的設定

1.mysql有預設的連線超時時間28800秒(8小時),如果在這段時間內你的應用沒有與資料庫有任何連線那麼mysql就會關閉連線,你的應用也就掛了,資料庫連不上了,你可以通過下面兩個屬性來設定mysql的連線超時時間

wait_timeout=28800
interactive_timeout=28800

這兩個屬性的值最好一致

2.c3p0有一個最大空閒時間的屬性--maxIdleTime,它的預設值為0,如果你不設定這個屬性那麼你的連線將永遠都不會被丟棄

那麼在瞭解上述兩個特點之後,我們就可以輕易的判斷出問題的原因了,即如果在mysql連線超時時間段內沒有任何操作那麼資料庫就會自動斷開連線,而這個時候由於c3p0連線池沒有設定最大空閒時間屬性,它的連線將永遠不會被銷燬,換言之就是資料庫連線自動斷開後,連線池也不會產生新的連線,

那麼問題來了,c3p0連線池的maxIdleTime屬性如何設定呢?

非常很簡單,只要這個值小於你mysql資料庫的wait_timeout屬性值就行.