最近はStruts2とHibernateを組み合わせてWebアプリを書いてます。
ある程度できてきたのでJmeterで負荷テストしてみると、あっという間にDBとの接続が埋まってしまい接続できなくなる事象が発生。「Too Many Connections」が出ます。getCurrentSession()でコネクションが自動で閉じられるはずなのですが、ちゃんとセッションが閉じられていないようです。ネットで調査したところ、同じような人が他にも多数いましたね。
で原因ですが、Hibernateでコネクション管理を利用することが問題だそうです。HibernateからC3P0を使う場合も同じです。
動きとしてはStruts2でアクセスする度にセッションを初期生成(new Configuration().configure().buildSessionFactory();)する仕様で、一回リクエストする度にセッションが増加するというもの。
対策としては、Hibernateのコネクション管理を利用せず、JNDI経由でDBCPのコネクション管理を利用する方式に変更することで正常に動作するようになった模様。