2008-12-03 61 views

回答

249

1.1)第一級緩存

一級緩存總是與帶Session對象。 Hibernate默認使用這個緩存。在這裏,它處理一個 交易後另一個,意味着將不會處理一個交易很多 次。主要是它減少了在給定事務中產生的需要的SQL查詢的數量,即 。這是在 之後更新在交易中完成的每個修改而不是更新,它僅在交易結束時更新交易 。

1.2)二級緩存

二級緩存總是與帶會話工廠對象。在運行事務時,它會在會話工廠級加載 對象,以便這些對象可用於整個應用程序,而不是綁定到單個用戶的 。由於 對象已經加載到緩存中,只要對象是查詢返回的 ,那麼就不需要去查詢數據庫 事務。這樣二級緩存就可以工作。這裏我們也可以使用 查詢級別的緩存。

引自:http://javabeat.net/introduction-to-hibernate-caching/

+24

+1用於使用會話工廠對象映射具有會話對象和二級緩存的一級緩存。我甚至不需要繼續閱讀。 – Mahes 2011-11-02 19:55:08

+1

1級緩存。在大多數情況下它不是必需的,但沒有選擇擺脫它。但你應該始終考慮這個問題.. – ses 2013-03-28 17:39:28

+3

@ses在大多數情況下你需要一級緩存。否則,你會遇到非常糟糕的性能問題,比如N + 1查詢,或者沒有預先獲取緩存,或者每次訪問屬性時查詢一次。 – 2013-04-03 02:41:19

103

有第一級緩存對Streamline Logic博客一個不錯的解釋。

基本上,第一級緩存發生在每個會話的基礎上,因爲第二級緩存可以在多個會話之間共享。

3

默認情況下,NHibernate使用基於會話對象的第一級緩存。但是如果您在多服務器環境中運行,那麼第一級緩存可能不具有可擴展性以及一些性能問題。發生這種情況的原因是,由於數據分佈在多個服務器上,因此必須非常頻繁地訪問數據庫。換句話說,NHibernate提供了一個基本的,不太複雜的進程中的L1緩存。但是,它不提供緩存解決方案必須對應用程序性能產生顯着影響的功能。

所以所有這些問題的問題是使用與會話工廠對象關聯的L2緩存。它減少了到數據庫的時間消耗,最終增加了應用程序響應時間。

-3

在二級緩存中,域hbm文件可以是可變關鍵字並且值爲假。 例如, 在此域類中,一天中的某些持續時間與普遍真理保持不變。所以,它可以在應用程序中標記爲不可變。

66

休眠緩存的一些基本解釋...

一級緩存與「會話」對象相關聯。 緩存對象的範圍屬於會話。一旦會話關閉,緩存的對象就會永遠消失。 默認情況下啓用一級緩存,您無法禁用它。 當我們第一次查詢實體時,它從數據庫中檢索並存儲在與休眠會話關聯的第一級高速緩存中。 如果我們用相同的會話對象再次查詢同一個對象,它將從緩存中加載並且不會執行sql查詢。 使用evict()方法可以從會話中刪除加載的實體。如果使用evict()方法刪除了該實體,則該實體的下一次加載將再次進行數據庫調用。 整個會話緩存可以使用clear()方法刪除。它將刪除存儲在緩存中的所有實體。

二級緩存與第一級緩存相距甚遠,可以在會話工廠範圍內全局使用。 二級緩存在會話工廠作用域中創建,並可用於使用該特定會話工廠創建的所有會話中。 這也意味着一旦會話工廠關閉,與其關聯的所有高速緩存死亡並且高速緩存管理器也關閉。 每當hibernate會話嘗試加載一個實體時,首先它會在第一級緩存中查找實體的緩存副本(與特定的休眠會話相關聯)。 如果實體的緩存副本存在於第一級緩存中,則它將作爲加載方法的結果返回。 如果第一級緩存中沒有緩存實體,則查找第二級緩存以查找緩存實體。 如果第二級緩存具有緩存實體,則作爲加載方法的結果返回。但是,在返回實體之前,它也存儲在一級緩存中,以便實體的下一次調用load方法將從一級緩存本身返回實體,並且不需要再次轉到二級緩存。 如果還沒有在第一級緩存和第二級緩存中找到實體,則執行數據庫查詢並將實體存儲在兩個緩存級別中,然後作爲load()方法的響應返回。

0

一級高速緩存

會話對象包含一級高速緩存數據。它是默認啓用的。一級緩存數據將不可用於整個應用程序。應用程序可以使用許多會話對象。

第二級緩存

SessionFactory對象保存第二級緩存數據。存儲在二級緩存中的數據將可用於整個應用程序。但我們需要明確地啓用它。

相關問題