2013年12月12日木曜日

HibernateのMySQL/JDBCコネクションが途切れる問題

HibernateでMySQLへの接続が1日経つと例外が発生したので、なんでかなとちょっと調べてみました。どうやらこれはMySQLのJDBCの仕様のようで、8時間経つとコネクションが途切れるようです。

http://stackoverflow.com/questions/270800/why-does-hibernate-jdbc-mysql-drop-connections-after-a-day-or-so

ただ、JDBC側でautoReconnect=trueとして自動接続をするような対処方法を取ると、コネクションを自動接続してくれるものの、例外が発生したクエリをもう1度実行してくれる訳では無いので、面倒くさい副作用が発生します。

ということで、Hibernate側でselect 1などのテストクエリを出すような対処方法を取る解決方法があるようです。hibernate.cfg.xmlでのデフォルト設定では出てこないようなプロパティなので、どこを見ればいいのか戸惑いますが、以下の通り設定できるようです。

<!--connection pool--> 
<property name="hibernate.dbcp.maxActive">10</property> 
<property name="hibernate.dbcp.whenExhaustedAction">1</property> 
<property name="hibernate.dbcp.maxWait">20000</property> 
<property name="hibernate.dbcp.maxIdle">10</property> 

<!-- prepared statement cache--> 
<property name="hibernate.dbcp.ps.maxActive">10</property> 
<property name="hibernate.dbcp.ps.whenExhaustedAction">1</property> 
<property name="hibernate.dbcp.ps.maxWait">20000</property> 
<property name="hibernate.dbcp.ps.maxIdle">10</property> 

<!-- optional query to validate pooled connections:--> 
<property name="hibernate.dbcp.validationQuery">select 1</property> 
<property name="hibernate.dbcp.testOnBorrow">true</property> 
<property name="hibernate.dbcp.testOnReturn">true</property> 

http://stackoverflow.com/questions/7766023/hibernate-failed-to-execute-query-afte-1-day
http://my.safaribooksonline.com/book/programming/java/0321268199/performance/ch10lev1sec4

0 件のコメント:

コメントを投稿