记录Hibernate的缓存知识
一.Hibernate緩存的作用
? ? Hibernate是一個持久層框架,Hibernate要經常訪問物理數據庫。為了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能,Hibernate的緩存機制就發揮了很大的作用。緩存內的數據是對物理數據源中的數據的復制,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。
二.Hibernate緩存的分類
? ? Hibernate的緩存分為兩大類:一級緩存和二級緩存。
- Hibernate一級緩存又稱為“Session的緩存”,它是內置的,不能被卸載(不能被卸載的意思就是這種緩存不具有可選性,必須有的功能,不可以取消session緩存)。由于Session對象的生命周期通常對應一個數據庫事務或者一個應用事務,因此它的緩存是事務范圍的緩存。第一級緩存是必需的,不允許而且事實上也無法卸除。在第一級緩存中,持久化類的每個實例都具有唯一的OID。
-
Hibernate二級緩存又稱為“SessionFactory的緩存”,由于SessionFactory對象的生命周期和應用程序的整個過程對應,因此Hibernate二級緩存是進程范圍或者集群范圍的緩存,有可能出現并發問題,因此需要采用適當的并發訪問策略,該策略為被緩存的數據提供了事務隔離級別。第二級緩存是可選的,是一個可配置的插件,在默認情況下,SessionFactory不會啟用這個插件。
三.Hibernate緩存的管理
-
一級緩存的管理:當應用程序調用Session的save()、update()、saveOrUpdate()、get()或load(),以及調用查詢接口的 list()、iterate()--(用的是n+1次查詢,先查id,然后根據 id 到緩存里面查找,如果沒有命中,再到數據庫中查找該id對應的其他屬性)或filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新數據庫。 Session為應用程序提供了兩個管理緩存的方法: evict(Object obj):從緩存中清除參數指定的持久化對象。 clear():清空緩存中所有持久化對象,flush():使緩存與數據庫同步。當查詢相應的字段如(name),而不是對象時,不支持緩存。
-
Hibernate的二級緩存策略的一般過程如下:
???1:條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有字段)這樣的SQL句查詢數據庫,一次獲得所有的數據對象(這個問題要考慮,如果你查詢十萬條數據時,內存不是被占用)。
2:把獲得的所有數據對象根據ID放入到第二級緩存中。
3: 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。
?? 4:刪除、更新、增加數據的時候,同時更新緩存。
? Hibernate的二級緩存策略,是針對于ID查詢的緩存策略,對于條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query Cache。
四.如何判斷是否將數據放在二級緩存中
-
很少被修改的數據?
-
不是很重要的數據,允許出現偶爾并發的數據
-
不會被并發訪問的數據?
-
常量數據
五.二級緩存的插件有哪些
-
EhCache:可作為進程范圍的緩存,存放數據的物理介質可以是內存或硬盤,對Hibernate的查詢緩存提供了支持。
-
OSCache:可作為進程范圍的緩存,存放數據的物理介質可以是內存或硬盤,提供了豐富的緩存數據過期策略,對Hibernate的查詢緩存提供了支持。
-
SwarmCache:可作為群集范圍內的緩存,但不支持Hibernate的查詢緩存。
-
JBossCache:可作為群集范圍內的緩存,支持事務型并發訪問策略,對Hibernate的查詢緩存提供了支持。
? ??
轉載于:https://www.cnblogs.com/superpang/p/5312541.html
總結
以上是生活随笔為你收集整理的记录Hibernate的缓存知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oc-05-对象的创建
- 下一篇: 大数四则运算