Hibernate 快取,快照,Session.currentSession和getSession的區別
1,事務快取
Hibernate的預設快取(不能被取消),單會話快取(一級快取)。其只能被當前事務訪問,每個事務都有自己的快取
生命週期依賴於事務的生命週期:當事務結束時,快取的生命週期也結束(事務快取使用記憶體作為快取介質)
當使用會話的 get() 方法,load(),save(),saveOrUpdate()方法方法,update() 方法或查詢介面方法時,休眠會對實體物件存入快取。當通過load () ,get () 方法獲取物件時,會首先到快取中查詢,找不到則發出的的Sql語句去資料庫查,從而提高效率。
與一級快取管理相關的方法:
(1)session.evict(Object o):從session快取中刪除某一物件。
(2)session.clear():清空會話快取。
(3)session.contains(Object o):判斷會話快取中是否包含某一物件。
(4)session.flush():定義重新整理點。
2,應用範圍快取
二級快取,是單個的SessionFactory的快取其可以被應用程式的所有事務共享訪問快取的生命週期依賴於應用的生命週期:應用結束快取也就結束。
Hibernate中開啟二級快取(EHcache)
<!-- 開啟快取 --> <property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property> <!-- 新增需要快取的類 --> <class-cache usage="read-only" class="XXX.XXX.XXX"/>
3,叢集快取
多的SessionFactory的快取,在叢集環境中,快取被一個或多個機器的程序鎖共享。快取中的資料被複制到叢集中的每一個程序節點,程序間通過遠端通訊來保證快取中資料的一致性。介質可以是硬碟或記憶體。(有些休眠的二級快取第三方外掛支援叢集快取)
4,快照
即副本,休眠中的快照即資料庫的副本。快照中的資料始終保持與DB中一致。不能由程式碼進行修改。
當事務提交時休眠會把快照和會話快取中的資料進行比較,若不一致則進行更新資料庫同時更新快照。即呼叫了了Session.update()等方法修改了會話快取,在事務commint()時即session的同步才會更新資料庫。
session同步時間點只有一個即事務得commit(),由可能更新資料庫。
會議的重新整理有很多個刪除(),更新,獲得()都是重新整理。
5,Session.currentSession和的的getSession的區別
currentsession:1,同一個執行緒會話一樣
2,事務提交或者回滾之後會自動關閉會話
3,需要註冊環境
4,查詢語句必須在事務內查詢
的getSession:1,每次都獲取一個新的會話
2,必須手動關閉
3,無需祖冊執行環境
4,查詢語句可以不在事務內執行