Hibernate 快取 學習筆記

2021-09-01 14:01:50 字數 2640 閱讀 2314

一. 什麼是快取

快取是位於應用程式與物理資料來源之間,用於臨時存放複製資料的記憶體區域,目的是為了減少應用程式對物理資料來源訪問的次數,從而提高應用程式的執行效能. 

hibernate在查詢資料時,首先到快取中去查詢,如果找到就直接使用,找不到的時候就會從物理資料來源中檢索,所以,把頻繁使用的資料載入到快取區後,就可以大大減少應用程式對物理資料來源的訪問,使得程式的執行效能明顯的提公升.

二. hibernate快取分類

1.session快取

被稱為一級快取,它是hibernate的內建快取,不能被解除安裝,並且每個session對應自己的快取,不能跨越session進行該級別的快取。  舉例:在乙個session中 , 使用get(***.class, id) 連續執行n次(id相同),只會執行一次資料庫查詢。但但跨session後, 則會被執行多次。

2.sessionfactory快取

sessionfactory的快取分為內建快取和外接快取,跨session級別.

1).內建快取 存放的是sessionfactory物件的一些集合屬性包含的資料(對映元素據及預定義sql語句等),對於應用程式來說,它是唯讀的.

2).外接快取 被稱為二級快取,存放的是資料庫資料的副本。二級快取除了以記憶體作為儲存介質外,還可以選用硬碟等外部儲存裝置.

3. 無論是一級快取, 還是二級快取,都是只快取實體物件的,只是二者的週期不同罷了。 支援一級快取和二級快取的方法有 get(), load(), iterate(查詢實體物件),,其中 query 和criteria的list() 只會快取,但不會使用快取(除非結合查詢快取)。

4.什麼樣的資料適合放在二級快取中?

1).很少被修改的資料;

2).不是很重要的資料,允許出現偶爾併發的資料(重要資料:金融賬戶資料);

3).不會被併發訪問的資料;

4).參考資料,指的是**用參考的常量資料,它的例項數目有限,它的例項會被許多其他類的例項引用,例項極少或者從來不會被修改。

5.什麼樣的資料不適合放到二級快取中?

1).經常被修改的資料;

2).財務資料,絕對不允許出現併發;

3).與其他應用共享的資料。

6.二級快取策略的一般過程

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

2):把獲得的所有資料物件根據id放入到第二級快取中。

3):當hibernate根據id訪問資料物件的時候,首先從session一級快取中查;查不到,如果配置了二級快取,那麼從二級快取中查;查不到,再查詢資料庫,把結果按照id放入到快取。

4):刪除、更新、增加資料的時候,同時更新快取。

三. 二級快取配置

hibernate二級快取要通過外掛程式來實現,hibernate提供了org.hibernate.cache.cacheprovider藉口,它充當快取外掛程式與hibernate之間的介面卡 . 常用的二級快取外掛程式 

ehcache       org.hibernate.cache.ehcacheprovider

oscache       org.hibernate.cache.oscacheprovider

swarmcahe  org.hibernate.cache.swarmcacheprovider

jbosscache   org.hibernate.cache.treecacheprovider

其中ehcache的配置方法

1). 將echcache.xml檔案拷貝到src下

2). 配置檔案

hibernate.cfg.xml 方式

org.hibernate.cache.ehcacheprovider

true

spring

org.hibernate.cache.ehcacheprovider

true

四.查詢快取

查詢快取是針對普通屬性結果集的快取,對實體物件的結果集只快取id(其id不是物件的真正id,它與查詢的條件相關即where後的條件相關,不同的查詢條件,其快取的id也不一樣),查詢快取的生命週期,當前關聯的表發生修改或是查詢條件改變時,那麼查詢快取生命週期結束,它不受一級快取和二級快取的生命週期的影響。但最好要配合二級快取的使用。 開啟查詢快取的方式

1).cfg.xml

true
2).spring

true

在程式中,必須手動開啟查詢快取, 如 query.setcacheable(true);

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

注意事項:

1.使用快取時, 要對entity進行配置

如若是註解方式 需配置 

@cache(usage=cacheconcurrencystrategy.read_only)
若是hbm.xml對映方式, 需配置("read-only" 快取策略)

也可在hibernate cfg.xml 檔案中配置

2.get和load都可以使用二級快取, createsqlquery執行的sql查詢,無法使用查詢快取

Hibernate學習筆記 快取

一級快取和二級快取和查詢快取 面試題 a 什麼是快取 b 什麼是一級快取,session級別的快取 c 什麼是二級快取,sessionfactory級別的快取,可以跨越session存在 i.經常被訪間 ii.改動不大不會經常改動 iii.數重有限 d 開啟二級快取 i.hibernate.cfg....

hibernate快取學習

hibernate的核心api就是hibernatesession,這個session是從factorysession獲取的,他控制著hibernate的所有 持久化的操作 hibernate的快取是分為兩級的,以及快取是乙個事務快取,是必須使用的,測試用例就是在乙個事務查詢兩次 同乙個語句,只會列...

hibernate學習 快取機制

在之前的hibernate學習中,我們無論是curd,對單錶查詢還是檢索優化,我們好像都離不開session,session我們之間也簡單的說過,它是乙個快取,這一篇文章就就hibernate的快取進行一些介紹,我們將從以下幾點進行 一丶快取的分類 hibernate中快取分為一級快取和二級快取,像...