1. 程式人生 > >Hibernate 一 二級快取配置和原理

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) 刪除、更新、增加資料的時候,同時更新快取。