最近用 Hibernate 3 連接 Mysql 4 數(shù)據(jù)庫。
調(diào)試時都還好,真正發(fā)布的時候毛病來了。
每天早晨都要都會報錯,不能正常操作數(shù)據(jù)庫。
Mysql 重啟,無效,Tomcat 重啟,有效。
Mysql(MySQL 4.1) 文檔 7.5.2 節(jié)
Tuning Server Parameters 里面
在 Mysql控制臺下輸入 SHOW VARIABLES;
最后一個參數(shù)
wait_timeout?? ?28800
如果單位是秒,也就是 8 個小時。
程序最后一次建立連接完畢之后 8 個小時,
Mysql 單方面關(guān)閉了這個連接。
但 Hibernate 還在記憶著這個連接基本信息。
程序再次連接的時候,已經(jīng)不存在了。
不過,Hibernate 可以設(shè)置它自己的 timeout 。
到了 Hibernate 3 默認(rèn)第三方的連接池管理,
由 Apache 的 DBCP 項目更換成了 c3p0 項目。
它的屬性在 Hibernate 配置屬性有對應(yīng)的寫法,如:
c3p0.maxIdleTime = hibernate.c3p0.timeout
c3p0.maxPoolSize = hibernate.c3p0.max_size
所以,要修改一下 hibernate.cfg.xml 文檔
將 Hibernate 默認(rèn)連接池參數(shù)
<property name="connection.pool_size">5</property>
刪除或注釋掉,Hibernate 默認(rèn)連接池比較初級。
然后,加入以下屬性
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_size">5</property>
就可以使用 c3p0 來管理連接池了。
其實這些屬性的參數(shù)名都可以在 Hibernate 文檔 3.3 節(jié)
JDBC connections 里面找到。
按照相應(yīng)的格式更改名字和值就可以了。