求職複習系列5 hibernate緩存和mybatis緩存

hibernate 緩存

一級緩存:Hibernate默認的緩存機制,它屬於Session級別的緩存機制,也就是說Session關閉,緩存數據消失。

二級緩存:屬於SessionFactory級別的緩存,二級緩存是全局性的,應用中的所有Session都共享這個二級緩存。

二級緩存默認是關閉的,一旦開啟,當我們需要查詢數據時,會先在一級緩存查詢,還是沒有,再去二級緩存

一級緩存

Session的save()方法持久化對象時,程序並不會立刻將這個數據搞到數據庫,而是將它放在了Session的一級緩存中,Session的get()、load()方法也是,當我們調用Session的flush()時,數據才會一併存到數據庫

這裡也涉及到hibernate的三種狀態,

遊離態,持久態,臨時態

一級緩存中常用其他方法:

session.evit(Object obj) 將指定的持久化對象從一級緩存中清除,釋放所佔用的內存資源,該對象從持久化狀態成為遊離對象

session.clear() 將一級緩存中的所有持久化對象清除,釋放其佔用的內存資源。

session.contains(Object obj) 判斷指定的對象是否存在於一級緩存中。

session.flush() 刷新一級緩存區的內容,使之與數據庫數據保持同步。

二級緩存

 
<property>true/<property>

<property>
org.hibernate.cache.ehcache.EhCacheRegionFactory
/<property>

<property>ehcache.xml/<property>

\t\t<property>thread/<property>

註解 在實體類上

@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)

二級緩存的使用策略一般有這幾種:read-only、nonstrict-read-write、read-write、transactional。注意:我們通常使用二級緩存都是將其配置成 read-only ,即我們應當在那些不需要進行修改的實體類上使用二級緩存,否則如果對緩存進行讀寫的話,性能會變差,這樣設置緩存就失去了意義。

總結

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

1) 很少被修改的數據   

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

3) 不會被併發訪問的數據   

4) 常量數據   

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

1) 經常被修改的數據   

2) 絕對不允許出現併發訪問的數據,如財務數據,絕對不允許出現併發   

3) 與其他應用共享的數據。

整理來自:https://blog.csdn.net/vipmao/article/details/51517658

mybatis 緩存

一級緩存是SqlSession級別的緩存。默認開啟, 在操作數據庫時需要構造sqlSession對象,在對象中有一個數據結構(HashMap)用於存儲緩存數據。不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。

 1、第一次發起查詢,先去找緩存中是否有,如果沒有,從數據庫查詢。將查詢結果存儲到一級緩存中。

  2、如果中間sqlSession去執行commit操作(執行插入、更新、刪除),則會清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免髒讀。

  3、第二次發起查詢,先去找緩存中是否含有,緩存中有,直接從緩存中獲取用戶信息。

二級緩存是基於 mapper文件的namespace的,也就是說多個sqlSession可以共享一個mapper中的二級緩存區域,並且如果兩個mapper的namespace相同,即使是兩個mapper,那麼這兩個mapper中執行sql查詢到的數據也將存在相同的二級緩存區域中

二級緩存需要手動開啟,另外mapper.xml中也要添加<catch>標籤,如果默認不配置,就會使用默認配置,實體類也需要序列化


<settings>
<setting>
/<settings>


分享到:


相關文章: