簡體   English   中英

使用Java Hibernate進行會話管理

[英]Session Management with Java Hibernate

我有一個基於Hibernate的平台,它是從無狀態servlet構建的(一個用於注冊用戶,其余用於查詢db)。

我正在使用Hibernate的會話,如下所示:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
if ((null == session) || (session.isOpen() == false)) {
  session = HibernateUtil.getSessionFactory().openSession();
}

當前,為了避免openSession()調用,我不關閉servlet末尾的會話(如果可能,嘗試使用打開的會話)。

最佳做法是什么? 我應該什么時候結束這些會議?

你能舉個例子嗎?

提前致謝 !

最佳做法是在大多數情況下按請求進行會話。 即,在處理請求的開始處打開一個會話,然后在結束時將其關閉。 例如,您可以在Servlet Filter執行此操作。

整個應用程序只有一個會話是不好的,因為它將在其一級緩存中積累大量實體,這是內存泄漏。 當多個客戶端同時使用它時,它可能還會產生不確定的結果。

但是,您的代碼並未針對整個應用程序使用一個會話-它使用的是“當前會話”概念,該概念打開一個會話並將其存儲在上下文中(例如ThreadLocal )。 但是,如果不關閉它,它將永遠存在。 另外,它將引起與上述相同的問題,因為線程在Web應用程序中被重用,並且新請求在某個時候將獲得舊的,未關閉的會話。

最好為每個請求打開一個新會話,並在處理完請求后關閉該會話。 喜歡

Session session = HibernateUtil.getSessionFactory().openSession();

代替

Session session = HibernateUtil.getSessionFactory().getCurrentSession();

如果我們使用getCurrentSession()方法,則tansaction.commit()/ rollback()將關閉連接。

最好的方法是管理休眠會話,就是為每個請求打開一個新會話。 這完全取決於您如何獲得會話。

  • 如果使用sessionFactory.getCurrentSession(),則將獲得綁定到事務生命周期的“當前會話”,並在事務結束(提交或回滾)時自動刷新並關閉它
  • 如果決定使用sessionFactory.openSession(),則必須自己管理會話並“手動”刷新並關閉它。
 if (!session.isOpen()) { session = session.getSessionFactory().openSession(); session.beginTransaction(); } 

我最好建議您使用spring框架。 因為在春季,您可以在方法級別使用@Transactional ,並且會話將由事務管理器自動創建和關閉(除非您在視圖攔截器中使用任何打開的會話)並使用由框架內部處理的AOP

@Autowired
EntityManager em;

@Transactinal
void save(User user){
   em.persist(user);
}

多數民眾贊成在所有的春天很有趣:D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM