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;

}

メモリリークも解消。
単純なことだけど間違いやすそうなので気をつけたい。