2016-12-13 106 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(); 
} 

需要我關閉會話與否?如何巧妙地做到這一點?

+1

不,這不是JPA API。請不要以這種方式將它標記爲 –

+0

,你自己管理會話和事務,所以是的,你必須在任何CRUD操作之後關閉它,除非你想在執行鏈中重用它(*不是*並行) – AntJavaDev

回答

-1

不,實際上你的web franework(如spring)或聲明式事務管理會爲你做這件事。但有些情況下您想自己管理會話。像批處理一樣 - 因爲休眠會話緩存不斷增長

+0

hibernate會話(JPA中的EntityManager)可能是容器或應用程序管理的,這裏我們是第二種情況 – Gab

+0

如果你把它從hibernate會話中拿出來,你明確的關閉了EntityManager嗎? – Sergey

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作爲
接口會話

連接的close()

通過釋放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(); 
     } 
} 
相關問題