來源於論壇討論:原帖連結
在 Hibernate 中:
Session session = getSession();此
session物件是否類似HttpSession,同樣代表一次會話?
session.close()需及時關閉資源,是否相當於 HttpSession 設定存活時間、適當時機invalidate()?
| 維度 | Hibernate Session | HttpSession |
|---|---|---|
| 本質 | 活動/工作單元概念,通常伴隨交易啟用 | 為維護「這次與上次」會話連續性,保留客戶端狀態資料 |
| 比喻 | 像「一次會議」,無論持續多久,皆屬同一次會議內部事務。不存在超時機制 | 像「定期開會」,每次皆留下會議紀要供下次參考。通常有超時限制 (如 20 分鐘無活動銷毀所有歷史紀要) |
| 生命週期 | 由應用程式主動控制開啟/關閉,通常對應單一業務交易或請求範圍 | 由 Servlet 容器自動管理,依閒置時間自動失效,跨多個 HTTP 請求 |
| 資源關閉 | close() 釋放 JDBC 連線、清除快取,必須顯式呼叫 (或透過框架自動管理) |
invalidate() 移除伺服器端會話資料,通常由容器依超時自動觸發 |
| 儲存內容 | 持久化上下文:管理實體物件狀態、一級快取、延遲載入支援 | 任意鍵值對:購物車、使用者偏好、登入憑證等應用層狀態 |
| 執行緒安全 | 非執行緒安全,嚴禁多執行緒共用同一 Session | 容器保證同一會話 ID 的請求序列化存取,相對安全 |
close() 歸還連線而非關閉實體連線JSESSIONID@Transactional 或 Servlet Filter 統一管理開關雖名稱皆含「Session」,但 Hibernate Session 是資料存取層的工作單元,HttpSession 是 Web 層的會話狀態容器。兩者職責、生命週期、管理方式截然不同,混淆兩者將導致嚴重架構錯誤。理解差異是建構穩健 Java EE 應用的基礎。