Hibernate 的緩存機制是為了提高應用程序的性能,通過減少對數據庫物理數據源的訪問頻次而設計的。Hibernate 的緩存主要可以分為兩個級別:一級緩存(也稱為 Session 級別的緩存)和二級緩存(也稱為 SessionFactory 級別的緩存)。
一級緩存(Session 緩存)
- 內置:一級緩存是 Hibernate 默認的,與 Session 緊密相關,且不能被卸載。
- 生命周期:與 Session 的生命周期相同,當 Session 關閉或清除時,一級緩存中的數據也會被清除。
- 作用范圍:緩存只對當前 Session 有效,不同的 Session 之間無法共享數據。
- 實現方式:通過 Session 的 get() 或 load() 方法從數據庫中加載對象時,Hibernate 會將這些對象放入一級緩存中。當再次需要這些對象時,會首先從一級緩存中查找,如果找到則直接返回,避免了對數據庫的再次訪問。
二級緩存(SessionFactory 緩存)
- 可配置:二級緩存是一個可選的插件,可以在 Hibernate 配置文件中進行配置。
- 生命周期:二級緩存的生命周期與 SessionFactory 的生命周期相同,通常比一級緩存的生命周期長。
- 作用范圍:可以被多個 Session 共享,因此可以實現跨 Session 的數據緩存。
- 實現方式:二級緩存中存放的是對象的序列化數據,當需要從二級緩存中獲取對象時,Hibernate 會先將其反序列化為對象。
- 分類:
- 內置緩存:主要存儲 Hibernate 的元數據(如映射文件、預定義的 SQL 語句等),這些數據是只讀的,不需要進行同步。
- 外置緩存:用于存儲數據庫數據的拷貝,可以被多個 Session 共享。外置緩存的介質可以是內存或硬盤。
緩存的并發訪問策略
- Hibernate 提供了多種并發訪問策略,如只讀、讀寫、非嚴格讀寫等,用于控制多個事務或 Session 并發訪問緩存時的行為。
緩存的同步
- 當數據庫中的數據發生變化時,Hibernate 需要保證緩存中的數據與數據庫中的數據保持一致。這通常是通過在數據更新時清除相關的緩存條目或通知緩存進行更新來實現的。
適合存放到二級緩存中的數據
- 通常,那些讀取頻繁、修改不頻繁的數據適合存放到二級緩存中,如用戶的基本信息、配置數據等。而一些經常變化的數據則不適合放入二級緩存,因為它們的變化會導致緩存失效,從而失去緩存的優勢。