hibernate Cacheable

今天仔仔細細的看了一下Hibernate的緩存,並做了實例實踐了一把。google一下,網上的教程、文章很多。
自己小結一下:

Hibernate的緩存分爲:

  • 一級緩存:在Session級別的,在Session關閉的時候,一級緩存就失效了。
  • 二級緩存:在SessionFactory級別的,它可以使用不同的緩存實現,如EhCache、JBossCache、OsCache等。

緩存的註釋寫法如下,加在Entity的java類上:

  • @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

緩存的方式有四種,分別爲:

  • CacheConcurrencyStrategy.NONE
  • CacheConcurrencyStrategy.READ_ONLY,只讀模式,在此模式下,如果對數據進行更新操作,會有異常;
  • CacheConcurrencyStrategy.READ_WRITE,讀寫模式在更新緩存的時候會把緩存裏面的數據換成一個鎖,其它事務如果去取相應的緩存數據,發現被鎖了,直接就去數據庫查詢;
  • CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,不嚴格的讀寫模式則不會的緩存數據加鎖;
  • CacheConcurrencyStrategy.TRANSACTIONAL,事務模式指緩存支持事務,當事務回滾時,緩存也能回滾,只支持JTA環境。

另外還有如下注意事項:

1、查詢緩存需要在Query的相應方法執行前加上這麼一句:

query.setCacheable(true);

在使用Hibernate時,獲得的query有setCacheable方法,可以設置使用緩存,但當使用JPA時,javax.persistence.Query並沒有setCacheable方法,此時如果JPA的實現是Hibernate時,可以將其進行如下轉化,再調用setCacheable方法(如果JPA的實現是其它ORMAP框架,就不知道怎麼做了)。

if (query instanceof org.hibernate.ejb.QueryImpl) {
    ((org.hibernate.ejb.QueryImpl) query).getHibernateQuery().setCacheable(
true);
}

2、還有就是查詢緩存的查詢執行後,會將查詢結果放入二級緩存中,但是放入的形式是以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" />
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章