最近、私のトムキャットがハングアップし始めました。リクエストは返信されませんでした。接続が接続プールに返されないことが原因であることがわかりました。
c3p0 を hibernate で使用しており、データベースは mysql 5.5 です。
接続リークをデバッグするために、次のプロパティをhibernate.cfg.xml
<property name="hibernate.c3p0.unreturnedConnectionTimeout">30</property>
<property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces">true</property>
それらを追加した後、ログに次のように表示されます:
[2013-10-12 23:40:22.487] [ INFO] BasicResourcePool.removeResource:1392 - A checked-out resource is overdue, and will be destroyed: com.mchange.v2.c3p0.impl.NewPooledConnection@1f0c0dd
[2013-10-12 23:40:22.487] [ INFO] BasicResourcePool.removeResource:1395 - Logging the stack trace by which the overdue resource was checked-out.
java.lang.Exception: DEBUG ONLY: Overdue resource check-out stack trace.
を指していますat dao.DAOBasicInfo.getBean(DAOBasicInfo.java:69)
public static Basicinfo getBean(Integer iduser) {
Basicinfo u = null;
Session sess = NewHibernateUtil.getSessionFactory().openSession();
try {
Transaction tx = sess.beginTransaction(); //line 69
Query q = sess.createQuery("from Basicinfo where iduser=" + iduser);
u = (Basicinfo) q.uniqueResult();
if (u == null) {
u = new Basicinfo();
u.setIduser(iduser);
}
tx.commit();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
sess.close();
}
return u;
}
クロスチェックしたところ、 Mysql は InnoDB とのトランザクションをサポートしていると言っています
上記のエラーが原因で、接続が返されず、接続が積み重なってアプリが応答しなくなります。
トランザクションを開始する際に何が問題なのか教えてください。私はfinallyを使用していますが、例外はスローされません。