首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Hibernate Session 與 HttpSession 的關鍵差異與正確關閉時機

     編輯:Java 程式設計入門

核心概念區分

許多 Java 初學者容易混淆 javax.servlet.http.HttpSession 與 org.hibernate.Session,兩者雖同名但職責截然不同。

HttpSession:Web 容器管理的用戶會話

  • 產生機制:由 Servlet 容器(如 Tomcat、Resin)自動為每位新訪客建立,作為用戶身份的唯一標識。
  • 主要用途:存放用戶名、權限、購物車商品等跨請求共享的數據。
  • 獲取方式:HttpSession session = request.getSession();
  • 銷毀時機:用戶超過容器設定的閒置時間(預設通常 20 分鐘)無操作,容器自動銷毀;亦可調用 session.invalidate() 主動銷毀。

Hibernate Session:資料庫操作的輕量級句柄

  • 本質:Hibernate 操作資料庫的核心介面,非線程安全,生命週期短暫。
  • 創建與關閉:由開發者手動控制,通常在業務邏輯層開啟、傳遞給 DAO 層使用、最後在業務層關閉。
  • 典型模式:
    Session session = HibernateSessionFactory.openSession();
    Transaction tx = null;
    try {
        tx = session.beginTransaction();
        // 業務操作,可能調用多個 DAO 方法
        dao.update(entity1, session);
        dao.update(entity2, session);
        tx.commit();
    } catch (Exception e) {
        if (tx != null) tx.rollback();
        throw e;
    } finally {
        HibernateSessionFactory.closeSession(session); // 確保關閉
    }

最佳實踐總結

  1. 不要將 Hibernate Session 存放在 HttpSession 中,會導致併發問題與資源洩漏。
  2. 採用 「請求級 Session」 模式:一個 HTTP 請求對應一個 Hibernate Session,請求結束即關閉。
  3. 使用 finally 區塊或 Spring 的 OpenSessionInViewFilter 保證 Session 必被關閉。
  4. 區分兩者生命週期:HttpSession 以「分/時」計,Hibernate Session 以「毫秒」計。

理解這兩者的本質區別,是避免記憶體洩漏、資料不一致等低級錯誤的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved