去年暑假厢汹,實(shí)驗(yàn)室和中國聯(lián)合航空公司簽了一個合同课舍,由我們
幫他們做一套旅游網(wǎng)站∷鳎現(xiàn)在項(xiàng)目已經(jīng)上線數(shù)月他挎,前一陣聯(lián)航那邊人員反映服務(wù)器內(nèi)存溢出等性能問題。結(jié)合實(shí)際捡需,我從前端頁面優(yōu)化办桨、nginx緩存動靜分離、后臺代碼優(yōu)化站辉、hibernate二級緩存等方面對系統(tǒng)進(jìn)行局部重構(gòu)呢撞。今天主要記錄一下這兩天對hibernate緩存的總結(jié)。
hibernate緩存有兩種:
- 一級緩存
一級緩存默認(rèn)開啟饰剥,不需開發(fā)者配置干預(yù)殊霞,因此也無法卸載(就是不得不用)。默認(rèn)為session
級別汰蓉,比如你開啟一個session
绷蹲,用這個session
進(jìn)行一次查詢(get或者load),hibernate
會把查詢的結(jié)果放進(jìn)緩存中顾孽,在該session
關(guān)閉之前并且是短時(shí)間內(nèi)如果再做一次這個操作祝钢,hibernate會直接從緩存中把數(shù)據(jù)拿過來而不會再發(fā)送sql語句進(jìn)行查詢 - 二級緩存
二級緩存是sessionFactory
級別的緩存。通常情況下若厚,由于sessionFactory
比較重量級拦英,所以它在內(nèi)存中通常為單例狀態(tài)。這種情況hibernate
會把session
查詢的結(jié)果放到二級緩存测秸。這樣即便不是同一個session
進(jìn)行的查詢疤估,如果是同樣的操作并且是在該sessionFactory
還沒有死掉,hibernate
會現(xiàn)在二級緩存中查霎冯,查不到再發(fā)送sql
語句铃拇。
一級緩存屬于事務(wù)范圍,由
hibernate
自己管理肃晚,程序員無需干預(yù)
二級緩存屬于進(jìn)程范圍和集群范圍锚贱,可以進(jìn)行配置和動態(tài)卸載加載
二級緩存配置:
hibernate 4 + ehcache
首先將
hibernate
下面中的ehcache
三個包導(dǎo)入工程,分別為:ehcache-core-2.4.3.ja关串、hibernate-ehcache-4.2.21.Final.jar拧廊、slf4j-api.jar
將
ehcache.xml
放入到src
目錄下-
修改
hibernate.cfg.xml
文件
3.1 啟動二級緩存
<property name="cache.use_second_level_cache">true</property>3.2 配置二級緩存的產(chǎn)品
xml
<property name="hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
3.3 指定二級緩存配置文件的位置
```xml
<property name="hibernate.cache.provider_configuration_file_resource_path">
ehcache.xml</property> ```
3.4 ```Query,Criteria```(查詢緩存)由于命中率較低,所以```hibernate```缺省是關(guān)閉
修改cache.use_query_cache為true打開對查詢的緩存晋修,
并且調(diào)用query.setCacheable(true)或criteria.setCacheable(true)吧碾。
<propertyname="cache.use_query_cache">true</property>