2016-12-13 7 views
1

私はSessionFactory選択後に休止状態のセッションを閉じる必要がありますか?

private SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); 
    public Session getSession() { 
      return sessionFactory.openSession(); 
     } 

を使用して、私のDAOクラスでそれを使用する場合:

public List<Entity> fetchEntities(Date fromDate, Date toDate) { 
Criteria criteria = getSession().createCriteria(Entity.class); 
     criteria.add(Restrictions.between("cts", fromDate, toDate)); 
     criteria.addOrder(Order.desc("cts")); 
     return (List<Entity>) criteria.list(); 
} 

は、私がセッションを閉じたりする必要はありませんか?どのようにcurectlyそれを行うのですか?

+1

いいえ、これはJPAのAPIではありません。このようにして –

+0

というタグをつけないでください。セッションとトランザクションを自分で管理しているので、CRUD操作後に閉じる必要があります。実行チェーン内で同じものを再利用したい場合を除いて(* *並行していない) – AntJavaDev

答えて

-1

実際、あなたのWebフランチャイズ(春のような)や宣言的な取引管理がこれを行います。しかし、セッションを自分で管理したい場合もあります。バッチ処理と同様に、休止状態のセッションキャッシュが常に増加しているため

+0

休止状態のセッション(JPAのEntityManager)はコンテナまたはアプリケーション管理されている可能性があります。ここでは2番目のケースです – Gab

+0

休止状態セッションからEntityManagerを明示的に閉じると、 – Sergey

0

休止状態セッションのスコープは、現在の作業単位(トランザクション)である必要があります(セッションはスレッドセーフではありません)。

アプリのライフサイクル全体にわたって工場を維持する必要があります。

も参照してくださいStruggling to understand EntityManager proper use

0
public List<Entity> fetchEntities(Date fromDate, Date toDate) { 
Criteria criteria = getSession().createCriteria(Entity.class); 
     criteria.add(Restrictions.between("cts", fromDate, toDate)); 
     criteria.addOrder(Order.desc("cts")); 
     return (List<Entity>) criteria.list(); 
} 

は、私がセッションを閉じたりする必要はありませんか?どのように正しくそれを行うのですか?

あなたはそれを閉じていないとあなたはそれぞれの要求に応じて新しいSessionインスタンスを取得した場合、それは動作してもよいが、それはまた、接続プールのボトルネックとして、またはメモリの使用よりも副作用があります。 close()はJDBC接続を解放し、何らかのクリーンアップを実行します。私は彼らが重要なことだと思う。

org.hibernate
インタフェースセッション

近い接続()

JDBC接続を解放し、クリーンアップしてセッションを終了します。

さらに、実行されたクエリごとにセッションを開いたり閉じたりしないでください。メソッドが他のクエリを実行している、または実行している別のメソッドから呼び出された場合は、すべてのクエリが実行されたときに接続を閉じる必要があります。
、唯一のクエリが実行されたリクエスト(ユーザー、バッチ...)での場合は、あなたができる:

public List<Entity> fetchEntities(Date fromDate, Date toDate) { 
    try{ 
     Session session = getSession(); 
Criteria criteria = session.createCriteria(Entity.class); 
     criteria.add(Restrictions.between("cts", fromDate, toDate)); 
     criteria.addOrder(Order.desc("cts")); 
     return (List<Entity>) criteria.list(); 
     } 
     finally { 
     if (session != null) { 
      session.close(); 
     } 
} 
関連する問題