Hibernate 一級 二級緩衝

2022-04-03 23:31:01 字數 3885 閱讀 8140

hibernate緩衝按級別共分為兩種,一級緩衝(session)和二級緩衝(sessionfactory),有的也說是三種,還有一種是查詢緩衝,當然,查詢緩衝是依託於二級緩衝。

ok,什麼是緩衝?

在記憶體裡開闢一塊空間把本來應該存在硬碟裡面的資料,存在這個空間裡面,將來,需要這塊資料的時候直接在記憶體中獲取。這個就可以簡單理解為緩衝。

一級緩衝

什麼是一級緩衝,一級緩衝是hibernate預設的,不用管它。

比如下面這段**,12

3456

78910

11@test

publicvoid findtestyijihuanchong()

我們發現,只會發出一條sql語句,那麼這個就是hibernate自帶的一級緩衝。

那比如下面這種情況,新開的session呢?在系統中,多執行緒併發的時候,肯定不止產生乙個session,所以在優化效能時,一級緩衝往往滿足不了需求,那麼就有了二級緩衝

比如下面這段**,顯然發出的是兩條sql語句。12

3456

78910

1112

1314

1516

@test

publicvoidfindtestyijihuanchong()

二級緩衝

什麼是二級緩衝?二級緩衝也可以理解為sessionfactory級別的緩衝,sessionfactory是生產session的工廠,那麼我們可不可以這麼理解,session關聯乙個指向資料庫的結果集,那麼下次我在發sql的時候,我發現,sessionfactory裡面已經有了乙個指向這個結果集的語句,那麼我是不是可以直接使用了!

具體來說,二級緩衝並不是由hibernate來提供,是由第三方提供的緩衝外掛程式,通常有以下幾種第三方緩衝外掛程式:

ehcache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,對hibernate的查詢快取提供了支援。

oscache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,提供了豐富的快取資料過期策略,對hibernate的查詢快取提供了支援。

swarmcache:可作為群集範圍內的快取,但不支援hibernate的查詢快取。

jbosscache:可作為群集範圍內的快取,支援事務型併發訪問策略,對hibernate的查詢快取提供了支援。

那麼,哪些資料適合放在二級緩衝中,理解二級緩衝特性之後,我們知道,

1、經常被查詢的資料,這樣的資料需要頻繁訪問資料庫,肯定是非常適合放在緩衝

2、很少併發的資料,什麼意思呢?打個比方,乙個查詢,乙個修改,這樣很可能會造成一種髒讀,或者是幻讀。意思就是你的資料庫的資料可能被修改了,但是設定二級緩衝還沒有及時更新

3、重要的資料,這個不多說

總之,放在二級緩衝中的資料,一般都是不重要的,不經常修改的資料。比如說,選單,比如說許可權。這些都是非常適合放在二級緩衝中,比如說財務資料,工資資料等,這些不建議放在二級緩衝中

我們上面講了二級緩衝是第三方提供的那麼顯然我們需要配置,

首先我們需要在我們的hibernate.cfg.xml中開啟我們的二級緩衝,當然也可能是properties檔案中配置12

3456

<propertyname="hibernate.cache.use_second_level_cache">true

<propertyname="hibernate.cache.provider_class">org.hibernate.cache.ehcacheprovider

<propertyname="hibernate.cache.use_query_cache">true

第二步,我們指定是哪個實體類需要二級緩衝

annotations配置12

3@entity

@cache(usage=cacheconcurrencystrategy.read_write)

@table(name="p_person")

xml配置12

3<classname="person"table="t_person">

<cacheusage="read-write"/>

<idname="id">

記住xml配置一定是id之前,class之內

還必須有ehcache.xml檔案,這個檔案有興趣大家可以在網上自己看一下,這裡我就不講解,裡面的內容了

配置完之後,我們直接看12

3456

78910

1112

1314

1516

@test

publicvoid findtesterjihuanchong()

這個時候,我們再看,肯定又是只傳送一條sql語句了。

查詢緩衝

什麼是查詢查詢緩衝。顧明思議它是查詢的時候產生的緩衝,那我們前面講到了二級緩衝,查詢緩衝和二級緩衝是什麼關係?首先查詢緩衝是依賴於二級緩衝的,查詢緩衝一般設定在list()方法中,查詢緩衝是重複查詢使用的緩衝,如果你兩個查詢不一樣,這個存在的緩衝是不起作用的。需要注意的是list()查詢緩衝必須要告訴hibernate,使用查詢緩衝,查詢緩衝才會生效。

setcacheable(true)

ok,看**12

3456

78910

1112

1314

@test

publicvoid findtestlist()

for(person person:person1)

s.gettransaction().commit();

}

到這裡,我們基本上做完了hibernate緩衝,但是緩衝怎麼配置,怎麼使用,要根據實際的專案情況而定,並不是說,配置了二級緩衝一定會提高系統效能。同時,高階的可能也牽涉到緩衝演算法等問題。當然在專案中多犯幾次錯誤,自然就會使用hibenrate緩衝了!

下篇博文寫悲觀鎖和樂觀鎖,寫完之後,我會寫一篇怎麼模仿開發一套屬於我們自己orm框架,基本上就寫完了hibenrate的常見特性,閒來無事,喜歡寫著玩,大家隨便看,有問題及時**。

Hibernate一級,二級快取

一級快取 session級別的快取 當session被open時,快取即被open 當session被close時,快取即被close 在快取open到close這段時間,多次載入同乙個持久化物件,只有第一次向資料庫傳送sql語句載入,之後的載入都是基於快取的 而二級快取是sessionfactor...

hibernate的二級緩衝

二級緩衝 什麼是二級緩衝?二級緩衝也可以理解為sessionfactory級別的緩衝,sessionfactory是生產session的工廠,那麼我們可不可以這麼理解,session關聯乙個指向資料庫的結果集,那麼下次我在發sql的時候,我發現,sessionfactory裡面已經有了乙個指向這個結...

hibernate 一級快取 二級快取

1.什麼事快取?指為了降低應用程式對物理資料來源 mysql 訪問數次。從而提高應用程式的執行效能 2.為什麼需要快取?orm框架 去訪問資料庫的速度,直接影響到程式的執行速度。所以優化orm訪問效率比較重要。hibernate的快取是提公升和優化hibernate訪問效率。3.快取工作原理?4.一...