Hibernate緩存原理

今天面試Hibernate緩存原理答不上來,太久沒看過基礎,以至於有點慌張,現在總結幫助以後面試發揮。

Hibernate緩存原理:

對於Hibernate這類ORM而言,緩存顯的尤為重要,它是持久層性能提升的關鍵.簡單來講Hibernate就是對JDBC進行封裝,以實現內部狀態的管理,OR關係的映射等,但隨之帶來的就是數據訪問效率的降低,和性能的下降,而緩存就是彌補這一缺點的重要方法.

緩存就是資料庫數據在內存中的臨時容器,包括資料庫數據在內存中的臨時拷貝,它位於資料庫與資料庫訪問層中間.ORM在查詢數據時首先會根據自身的緩存管理策略,在緩存中查找相關數據,如發現所需的數據,則直接將此數據作為結果加以利用,從而避免了資料庫調用性能的開銷.而相對記憶體操作而言,資料庫調用是一個代價高昂的過程.

一般來講ORM中的緩存分為以下幾類:

  • 1.事務級緩存:即在當前事務範圍內的數據緩存.就Hibernate來講,事務級緩存是基於Session的生命週期實現的,每個Session內部會存在一個數據緩存,它隨著Session的創建而存在,隨著Session的銷毀而滅亡,因此也稱為Session Level Cache.

  • 2.應用級緩存:即在某個應用中或應用中某個獨立資料庫訪問子集中的共用緩存,此緩存可由多個事務共用(資料庫事務或應用事務),事務之間的緩存共用策略與應用的事務隔離機制密切相關.在Hibernate中,應用級緩存由SessionFactory實現,所有由一個SessionFactory創建的 Session實例共用此緩存,因此也稱為SessionFactory Level Cache.

  • 3.分佈式緩存:即在多個應用實例,多個JVM間共用的緩存策略.分佈式緩存由多個應用級緩存實例組成,通過某種遠程機制(RMI,JMS)實現各個緩存實例間的數據同步,任何一個實例的數據修改,將導致整個集群間的數據狀態同步.

Hibernate的一,二級緩存策略:

Hibernate中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬於事務範圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬於進程範圍或群集範圍的緩存。這一級別的緩存可以進行配置和更改,並且可以動態加載和卸載,屬於多事務級別,要防止事務併發性。
緩存是以map的形式進行存儲的(key-id,value-object)
一級緩存(Session):
事務範圍,每個事務(Session)都有單獨的第一級緩存.

一級緩存的管理:

當應用程式調用Session的save()、update()、saveOrUpdate()、get()或load(),以及調用查詢介面的 list()、iterate()–(用的是n+1次查詢,先查id)或filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新資料庫。 Session為應用程式提供了兩個管理緩存的方法: evict(Object obj):從緩存中清除參數指定的持久化對象。 clear():清空緩存中所有持久化對象,flush():使緩存與資料庫同步。
當查詢相應的字段如(name),而不是對象時,不支持緩存。
二級緩存(SessionFactory):

Hibernate的二級緩存策略的一般過程如下:

  • 1.條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有字段)這樣的SQL句查詢資料庫,一次獲得所有的數據對象(這個問題要考慮,如果你查詢十萬條數據時,記憶體不是被佔用)。

  • 2.把獲得的所有數據對象根據ID放入到第二級緩存中。

  • 3.當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那麼從二級緩存中查;查不到,再查詢資料庫,把結果按照ID放入到緩存。

  • 4.刪除、更新、增加數據的時候,同時更新緩存。
    Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query Cache。

Q:什麼樣的數據適合存放到第二級緩存中?

  • 1.很少被修改的數據

  • 2.不是很重要的數據,允許出現偶爾併發的數據

  • 3.不會被併發訪問的數據

  • 4.參考數據,指的是供應用參考的常量數據,它的實例數目有限,它的實例會被許多其他類的實例引用,實例極少或者從來不會被修改。

不適合存放到第二級緩存的數據?

  • 1.經常被修改的數據

  • 2.財務數據,絕對不允許出現併發

  • 3.與其他應用共用的數據。

常用的緩存插件 Hibernater 的二級緩存是一個插件,下麵是幾種常用的緩存插件:

  EhCache:可作為進程範圍的緩存,存放數據的物理介質可以是記憶體或硬碟,對Hibernate的查詢緩存提供了支持。
  OSCache:可作為進程範圍的緩存,存放數據的物理介質可以是記憶體或硬碟,提供了豐富的緩存數據過期策略,對Hibernate的查詢緩存提供了支持。
  SwarmCache:可作為群集範圍內的緩存,但不支持Hibernate的查詢緩存。
  JBossCache:可作為群集範圍內的緩存,支持事務型併發訪問策略,對Hibernate的查詢緩存提供了支持。

配置二級緩存的主要步驟:

  • 1.選擇需要使用二級緩存的持久化類,設置它的命名緩存的併發訪問策略。這是最值得認真考慮的步驟。

  • 2.選擇合適的緩存插件,然後編輯該插件的配置檔。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×