這篇Blog是原來寫在別的地方的,今天將其轉(zhuǎn)到BlogJava上來。
-------------------------------------------------------------------------------
今天仔仔細細的看了一下Hibernate的緩存,并做了實例實踐了一把。google一下,網(wǎng)上的教程、文章很多。
自己小結(jié)一下:
Hibernate的緩存分為:
- 一級緩存:在Session級別的,在Session關(guān)閉的時候,一級緩存就失效了。
- 二級緩存:在SessionFactory級別的,它可以使用不同的緩存實現(xiàn),如EhCache、JBossCache、OsCache等。
緩存的注釋寫法如下,加在Entity的java類上:
- @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
緩存的方式有四種,分別為:
- CacheConcurrencyStrategy.NONE
- CacheConcurrencyStrategy.READ_ONLY,只讀模式,在此模式下,如果對數(shù)據(jù)進行更新操作,會有異常;
- CacheConcurrencyStrategy.READ_WRITE,讀寫模式在更新緩存的時候會把緩存里面的數(shù)據(jù)換成一個鎖,其它事務(wù)如果去取相應(yīng)的緩存數(shù)據(jù),發(fā)現(xiàn)被鎖了,直接就去數(shù)據(jù)庫查詢;
- CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,不嚴(yán)格的讀寫模式則不會的緩存數(shù)據(jù)加鎖;
- CacheConcurrencyStrategy.TRANSACTIONAL,事務(wù)模式指緩存支持事務(wù),當(dāng)事務(wù)回滾時,緩存也能回滾,只支持JTA環(huán)境。
另外還有如下注意事項:
1、查詢緩存需要在Query的相應(yīng)方法執(zhí)行前加上這么一句:
query.setCacheable(true);
在使用Hibernate時,獲得的query有setCacheable方法,可以設(shè)置使用緩存,但當(dāng)使用JPA時,javax.persistence.Query并沒有setCacheable方法,此時如果JPA的實現(xiàn)是Hibernate時,可以將其進行如下轉(zhuǎn)化,再調(diào)用setCacheable方法(如果JPA的實現(xiàn)是其它ORMAP框架,就不知道怎么做了)。
if (query instanceof org.hibernate.ejb.QueryImpl) {
((org.hibernate.ejb.QueryImpl) query).getHibernateQuery().setCacheable(true);
}
2、還有就是查詢緩存的查詢執(zhí)行后,會將查詢結(jié)果放入二級緩存中,但是放入的形式是以ID為Key,實例作為一個Value。
3、hibernate的配置文件中需加入如下信息:
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
posted on 2009-04-07 22:54
The Matrix 閱讀(10137)
評論(3) 編輯 收藏 所屬分類:
Hibernate