任何人都可以用簡單的語言解釋Hibernate中的第一級和第二級緩存是什麼?什麼是Hibernate中的一級和二級緩存?
回答
1.1)第一級緩存
一級緩存總是與帶Session對象。 Hibernate默認使用這個緩存。在這裏,它處理一個 交易後另一個,意味着將不會處理一個交易很多 次。主要是它減少了在給定事務中產生的需要的SQL查詢的數量,即 。這是在 之後更新在交易中完成的每個修改而不是更新,它僅在交易結束時更新交易 。
1.2)二級緩存
二級緩存總是與帶會話工廠對象。在運行事務時,它會在會話工廠級加載 對象,以便這些對象可用於整個應用程序,而不是綁定到單個用戶的 。由於 對象已經加載到緩存中,只要對象是查詢返回的 ,那麼就不需要去查詢數據庫 事務。這樣二級緩存就可以工作。這裏我們也可以使用 查詢級別的緩存。
有第一級緩存對Streamline Logic博客一個不錯的解釋。
基本上,第一級緩存發生在每個會話的基礎上,因爲第二級緩存可以在多個會話之間共享。
默認情況下,NHibernate使用基於會話對象的第一級緩存。但是如果您在多服務器環境中運行,那麼第一級緩存可能不具有可擴展性以及一些性能問題。發生這種情況的原因是,由於數據分佈在多個服務器上,因此必須非常頻繁地訪問數據庫。換句話說,NHibernate提供了一個基本的,不太複雜的進程中的L1緩存。但是,它不提供緩存解決方案必須對應用程序性能產生顯着影響的功能。
所以所有這些問題的問題是使用與會話工廠對象關聯的L2緩存。它減少了到數據庫的時間消耗,最終增加了應用程序響應時間。
在二級緩存中,域hbm文件可以是可變關鍵字並且值爲假。 例如, 在此域類中,一天中的某些持續時間與普遍真理保持不變。所以,它可以在應用程序中標記爲不可變。
休眠緩存的一些基本解釋...
一級緩存與「會話」對象相關聯。 緩存對象的範圍屬於會話。一旦會話關閉,緩存的對象就會永遠消失。 默認情況下啓用一級緩存,您無法禁用它。 當我們第一次查詢實體時,它從數據庫中檢索並存儲在與休眠會話關聯的第一級高速緩存中。 如果我們用相同的會話對象再次查詢同一個對象,它將從緩存中加載並且不會執行sql查詢。 使用evict()
方法可以從會話中刪除加載的實體。如果使用evict()
方法刪除了該實體,則該實體的下一次加載將再次進行數據庫調用。 整個會話緩存可以使用clear()
方法刪除。它將刪除存儲在緩存中的所有實體。
二級緩存與第一級緩存相距甚遠,可以在會話工廠範圍內全局使用。 二級緩存在會話工廠作用域中創建,並可用於使用該特定會話工廠創建的所有會話中。 這也意味着一旦會話工廠關閉,與其關聯的所有高速緩存死亡並且高速緩存管理器也關閉。 每當hibernate會話嘗試加載一個實體時,首先它會在第一級緩存中查找實體的緩存副本(與特定的休眠會話相關聯)。 如果實體的緩存副本存在於第一級緩存中,則它將作爲加載方法的結果返回。 如果第一級緩存中沒有緩存實體,則查找第二級緩存以查找緩存實體。 如果第二級緩存具有緩存實體,則作爲加載方法的結果返回。但是,在返回實體之前,它也存儲在一級緩存中,以便實體的下一次調用load方法將從一級緩存本身返回實體,並且不需要再次轉到二級緩存。 如果還沒有在第一級緩存和第二級緩存中找到實體,則執行數據庫查詢並將實體存儲在兩個緩存級別中,然後作爲load()
方法的響應返回。
這是關於First Level Caching和Second Level Caching很好的解釋。 易於理解和很好的解釋。
一級高速緩存
會話對象包含一級高速緩存數據。它是默認啓用的。一級緩存數據將不可用於整個應用程序。應用程序可以使用許多會話對象。
第二級緩存
SessionFactory對象保存第二級緩存數據。存儲在二級緩存中的數據將可用於整個應用程序。但我們需要明確地啓用它。
- 1. 休眠OGM和Hibernate OGM一級和二級緩存
- 2. Hibernate中的一級緩存
- 3. Hibernate 3.2.0中的二級緩存final
- 4. orm.xml中的Hibernate二級緩存?
- 5. 爲什麼不加入查詢命中Hibernate二級緩存?
- 6. Hibernate第二級緩存和Spring 3.1的@Cacheable的合適用例是什麼?
- 7. Hibernate的二級緩存+的Ehcache問題
- 8. 使用Hibernate的二級緩存有什麼缺點?
- 9. 清除Hibernate的二級緩存
- 10. 清除Hibernate的二級緩存
- 11. Hibernate的二級緩存 - 打印結果
- 12. Hibernate的二級緩存使用ecache
- 13. Hibernate一級緩存vs查詢緩存
- 14. HIbernate 2級緩存
- 15. Hibernate優化,使用二級緩存?
- 16. 何時使用Hibernate緩存(第二級)?
- 17. Hibernate 3.5.5,二級緩存配置
- 18. spring + hibernate + infinispan作爲第二級緩存
- 19. Spring + Hibernate with Hazelcast作爲二級緩存
- 20. Hibernate + Spring Data JPA二級緩存XML
- 21. Redis作爲Hibernate二級緩存
- 22. 你是否總是在Hibernate中使用二級緩存?
- 23. Hibernate.initialize()和二級緩存
- 24. 配置的二級緩存和數據不從二級緩存中加載
- 25. NHibernate二級緩存
- 26. 二級緩存不能在Hibernate + Spring + JPA和EhCache中工作
- 27. 將數據存儲在Hibernate的二級緩存中的位置?
- 28. 當一個Hibernate實例無法到達二級緩存時會發生什麼?
- 29. Hibernate的二級緩存是否可用於COUNT()操作?
- 30. 在二級緩存中緩存NHibernate DetachedCriteria
+1用於使用會話工廠對象映射具有會話對象和二級緩存的一級緩存。我甚至不需要繼續閱讀。 – Mahes 2011-11-02 19:55:08
1級緩存。在大多數情況下它不是必需的,但沒有選擇擺脫它。但你應該始終考慮這個問題.. – ses 2013-03-28 17:39:28
@ses在大多數情況下你需要一級緩存。否則,你會遇到非常糟糕的性能問題,比如N + 1查詢,或者沒有預先獲取緩存,或者每次訪問屬性時查詢一次。 – 2013-04-03 02:41:19