Hibernate 一 二級快取配置和原理
hibernate 的快取分為三大類,一級快取,二級快取和查詢快取
一級快取是hiSession級別的快取/事物快取,二級快取是Sessionfactory級別的快取
一級快取可以經過Sessionimpl類的兩個方法可以看出
- actionQueue它是一個行動佇列,它主要記錄crud操作的相關資訊。
- persistenceContext它是持久化上下文,它其實才是真正的快取。
-
// 測試一級快取
@Test
public void test3() {
// 1.得到session
Session session = HibernateUtils.openSession();
session.beginTransaction();Customer customer = session.get(Customer.class, 1); // 查詢id=1的Customer的物件,如果查詢到,就存到一級快取中
Customer customer2 = session.get(Customer.class, 1);//第二次在查Customer物件中的1時,就不走資料庫,那麼這個例子只走一條sql// 2.事務提交,並關閉session
session.getTransaction().commit();
session.close();
}}
第二次查沒有傳送第二條sql,是因為一級快取存了一條oid=1的資料放進了快取中,第二次查就從一級快取中查到不走資料庫了
現在我舉例來演示持久化物件具有自動更新資料庫的能力
一級快取常用API
常用方法
clear:清空一級快取,
evict:清空一級快取的指定物件
refresh()
:重新查詢資料庫,用資料庫中的資訊來更新一級快取與快照區。
一級快取的管理:
當應用程式呼叫session的save,saveorupdate,get,load,list
以及呼叫查詢介面的 list()、iterate()或
filter()方法時,如果在Session快取中還不存在相應的物件,Hibernate就會把該物件加入到第一級快取中。當清理快取時,
Hibernate會根據快取中物件的狀態變化來同步更新資料庫。 Session為應用程式提供了兩個管理快取的方法: evict(Object obj):從快取中清除引數指定的持久化物件。clear():清空快取中所有持久化物件
save,saveOrupdate,get,load,list,iterator 都會持久化到資料庫都是持久化狀態,但是都會走一級快取裡面存資料
我們看出 query.list() query.uniueResut() 不會從一級緩取資料! 但是query.list 或者query.uniqueRestu() 會向一級快取放資料的.
注意:
一級快取不需要配置,框架自帶的,所以我們的物件在二級快取中是可插拔的,通過evict方法和clear清空快取中的物件
當session關閉自動銷燬。
只要應用程式通過Session介面來執行儲存、更新、刪除、載入和查詢資料庫資料的操作,Hibernate就會啟用第一級快取,把資料庫
中的資料以物件的形式拷貝到快取中,對於批量更新和批量刪除操作,如果不希望啟用第一級快取,可以繞過Hibernate API,直接
通過JDBC API來執行指操作。
**********************************二級快取**********************
<!-- 啟動二級快取 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 指定使用哪種二級快取 -->
<property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
//通過獲取一個sesion,讓hibernate框架執行(config->載入hibernate.cfg.xml)
什麼樣的資料需要放在二級快取中,
1,很少被修改的資料
2.不是很重要的資料
3,財務資料不允許併發
二級快取中需要存放hibernate外掛
◆EhCache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,對Hibernate的查詢快取提供了支援。
◆OSCache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,提供了豐富的快取資料過期策略,對Hibernate的查詢
快取提供了支援。
◆SwarmCache:可作為群集範圍內的快取,但不支援Hibernate的查詢快取。
◆JBossCache:可作為群集範圍內的快取,支援事務型併發訪問策略,對Hibernate的查詢快取提供了支援。
最後簡述一下hibernate一級快取和二級快取的區別;
就是Session級別的快取。一個Session做了一個查詢操作,它會把這個操作的結果放在一級快取中。
如果短時間內這個session(一定要同一個session)又做了同一個操作,那麼hibernate直接從一級快取中拿,而不會再去連資料庫,取資料。
它是內建的事務範圍的快取,不能被解除安裝。
二級快取是sessionFactory 級別的快取
二級快取的過程
二級快取不像一級快取是自帶的,預設會把查詢結果快取到二級快取中
如果同一個sessionFactory建立的某個session執行了相同的操作,hibernate就會從二級快取中拿結果,而不會再去連線資料庫。
,SessionFactory快取分為兩類:內建快取和外接快取。我們通常意義上說的二級快取是指外接快取。
1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的資料物件。
2) 把獲得的所有資料物件根據ID放入到第二級快取中。
3) 當Hibernate根據ID訪問資料物件的時候,首先從Session一級快取中查;查不到,如果配置了二級快取,那麼從二級快取中查;查不到,再查詢資料庫,把結果按照ID放入到快取。
4) 刪除、更新、增加資料的時候,同時更新快取。