Hibernate中 一 二級快取及查詢快取

2021-08-27 22:49:18 字數 1906 閱讀 9140

一、一級快取 

一級快取的生命週期和session的生命週期一致,當前sessioin一旦關閉,一級快取就消失,因此一級快取也叫 

session 級的快取或事務級快取,一級快取只存實體物件的 ,它不會快取一般的物件屬性(查詢快取可以),即當獲得 

物件後,就將該物件的快取起來,如果在同一session中如果再去獲取這個物件 時,它會先判斷快取中有沒有該物件的 

id,如果有就直接從快取中取出,反之則去資料庫中取,取的同時將該物件的快取起來,有以下方法可以支援一級快取 

: * get() 

* load() 

* iterate(查詢實體物件) 

其 中 query 和criteria的list() 只會快取,但不會使用快取(除非結合查詢快取)。 

二、二級快取 

二級快取也稱程序級的快取或sessionfactory級的快取,二級快取可以被所有的session共享,二級快取的生命周 

期和 sessionfactory的生命週期一致。hibernate為實現二級快取,只提供二級快取的介面供第三方來實現(具體可以 

檢視 /performance.html#performance-cache)。二級快取也是快取實體物件 ,其實現原理與一級快取的差不多吧,其方法與一級的相同,只是快取的生命週期不一樣而已: 

* get() 

* load() 

* iterate(查詢實體物件) 

其中 query 和criteria的list() 只會快取,但不會使用快取(除非結合查詢快取)。 

二級快取的配置和使用: 

* 將echcache.xml檔案拷貝到src下 

* 開啟二級快取,修改hibernate.cfg.xml檔案 

true

* 指定快取產品提供商,修改hibernate.cfg.xml檔案 

org.hibernate.cache.ehcacheprovider

* 指定那些實體類使用二級快取(兩種方法) 

* 在對映檔案中採用標籤 

* 在hibernate.cfg.xml檔案中,採用標籤 

其快取策略有read-only,read- write,nonstrict-read-write,transactional

這裡的快取策略是針對你快取裡面的物件而言的,就比如read-only,它是限制快取中的物件不能被修改的。 

三、查詢快取 

查詢快取是針對普通屬性結果集的快取,對實體物件的結果集只快取id(其id不是物件的真正id,它與查詢的條件

相關即where後的條件相關,不同的查詢條件,其快取的id也不一樣) ,查詢快取的生命週期,當前關聯的表發生修改 

或是 查詢條件改變時,那麼查詢快取生命週期結束,它不受一級快取和二級快取的生命週期的影響,要想使用查詢緩 

存需要手動配置如下: 

* 在hibernate.cfg.xml檔案中啟用查詢快取,如: 

true

* 在程式中必須手動啟用查詢快取,如: 

query.setcacheable(true); 

其中 query 和criteria的list() 就可利用到查詢快取了。 

總結:(引用網路上前輩的話) 

不要想當然的以為快取一定能提高效能,僅僅在你能夠駕馭它並且條件合適的情況下才是這樣的。hibernate的二級快取限制還是比較多的,不方便用jdbc可能會大大的降低更新效能。在不了解原理的情況下亂用,可能會有1+n的問題。不當的使用還可能導致讀出髒資料。如果受不了hibernate的諸多限制,那麼還是自己在應用程式的層面上做快取吧。 

在越高的層面上做快取,效果就會越好。就好像儘管磁碟有快取,資料庫還是要實現自己的快取,儘管資料庫有快取,咱們的應用程式還是要做快取。因為底層的快取它並不知道高層要用這些資料幹什麼,只能做的比較通用,而高層可以有針對性的實現快取,所以在更高的級別上做快取,效果也要好些吧。 

hibernate二級快取

cacheconcurrencystrategy.none cacheconcurrencystrategy.read only 唯讀模式,在此模式下,如果對資料進行更新操作,會有異常 cacheconcurrencystrategy.read write 讀寫模式在更新快取的時候會把快取裡面的資料...

hibernate 二級快取

session快取 一級快取 sql查詢結果快取,由hibernate管理 sessionfactory內建快取,內建快取是hibernate自帶的,用於存放預定義的sql以及hbm.xml描述的元資料,不可解除安裝 sessionfactory外接快取 二級快取 由外部外掛程式提供,外接快取的資料...

Hibernate二級快取

hibernate的session在事務級別進行持久化資料的快取操作。當然,也有可能分別為每個類 或集合 配置集群 或jvm級別 sessionfactory級別 的快取。你甚至可以為之插入乙個集群的快取。注意,快取永遠不知道其他應用程式對持久化倉庫 資料庫 可能進行的修改 即使可以將快取資料設定為...