Hibernateメモリリーク解消
しばらく夏休みで旅行やら夏フェスやら行ってたのでご無沙汰だけど、
メモリリーク解消したので記録しておく。
問題のコード
HibernateのSessionを取得するための
DBアクセスクラスの抽象クラスに定義したgetSessionメソッド
Hibernateのチュートリアルを参考に書くと以下のようになる
protected Session getSession() { // Hibernate設定ファイルを取得 Configuration config = new Configuration().configure(); // SessionFactory生成 SessionFactory sessionFactory = config.buildSessionFactory(); // Sessionを生成 Session session = sessionFactory.openSession(); return session; }
しかしこれではセッションを取得する度にSessionFactoryオブジェクトを
生成してしまう。
SessionFactory (Hibernate JavaDocs)
にも以下の一文
Usually an application has a single SessionFactory.
修正後のコード
作りとしてはSessionFactoryはアプリケーションに1つだけ
Sessionはリクエスト毎に生成するというのが正しい
よって以下のように修正
// SessionFactoryオブジェクト private static final SessionFactory sessionFactory = new Configuration() .configure().buildSessionFactory(); protected Session getSession() { // Sessionを生成 Session session = sessionFactory.openSession(); return session; }
メモリリークも解消。
単純なことだけど間違いやすそうなので気をつけたい。