性能優化之Hibernate4配置二級緩存

配置JavaBean緩存的三種方式

①在使用JPA規範的bean中,添加@Cache註解,eg.

@Entity
@Table(name = “t_area”)
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
class Area{…}

hibernate有4種併發訪問策略:
· read-only:適合只讀事務,不會被修改的數據採用該策略併發性能最高。
· read-write:提供read committed數據庫隔離級別。對於經常被讀但很少修改的數據可以採用這種策略,可防髒讀。
· nonstrict-read-write:非嚴格讀寫不能保證緩存與數據庫中數據的一致性,若有兩個事務併發訪問緩存數據,則應配置一個很短的過期時間,以減少讀髒數據的可能。對於極少被修改且可容忍偶爾髒讀的數據可以採用這種併發策略,適合高併發讀寫事務。
· transactional:事務序列化,提供了Repeatable Read事務隔離級別,可防髒讀和不可重複讀。
目前還沒有提供商能夠支持全部策略。

②hibernate.cfg.xml中的標籤配置方式: <class-cache class="" usage="" />
③實體類的映射文件*.hb.xml中的標籤配置方式: <cache usage=" />


配置步驟

在繪製類似於熱力圖等,後臺返回的JSON數據通常可以達1M以上甚至更多,這時候可以考慮壓縮數據,例如GZIP。再考慮該數據是否基本不做修改,或者被修改的概率足夠低,這時二級緩存的策略就是性能優化的一種好的選擇。
然而在配置hibernate二級緩存的時候,大家應該先知道hibernate3和hibernate4的配置方式有着細微的差別。防止用錯方案走彎路。
博主主要就hibernate4的配置做講解:
①進入hibernate-release-4.2.4.Final\lib\optional\ehcache目錄,把ehcache-core-2.4.3.jar、hibernate-ehcache-4.2.4.Final.jar、slf4j-api-1.6.1.jar拷入項目的lib.
②配置hibernate.cfg.xml文件。

<!-- 開啓二級緩存 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 配置二級緩存使用的產品,RegionFactory爲Ehcache的RegionFactory -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 默認情況下,查詢緩存對HQL及QBC(Criteria)查詢無效,可以啓用如下設置 -->
<property name="cache.use_query_cache">true</property>
<!-- 記得在criteria查詢中調用 setCacheable(true) 方法 -->
<!-- 配置管理session的方式 -->
<property name="current_session_context_class">thread</property>
<!-- 二級緩存配置文件的位置 添加配置文件 
【ehcache.xml一般放在classpath或src下,也可以自定義文件名和路徑,
並在hibernate.cfg.xml中通過hibernate.cache.provider_configuration_file_resource_path參數指定 】-->
<!-- <property name="hibernate.cache.provider_configuration_file_resource_path">.../ehcache.xml</property> -->

Hibernate 自身提供了三種管理 Session 對象的方法:

thread: Session 對象的生命週期與本地線程綁定
jta*: Session 對象的生命週期與 JTA 事務綁定
managed: Hibernate 委託程序來管理 Session 對象的生命週期


小插曲:遇到java.lang.NoClassDefFoundError: org/hibernate/cache/spi/RegionFactory 錯誤
原因:觀察項目的Maven關聯,發現hibernate-core-4.0.1.Final.jar,即系統架構的hibernate版本是4.0.1的,引入hibernate-ehcache-4.2.4.Final.jar的ehcache方案與該版本號發生衝突。
解決方式:消除衝突,Google下載hibernate-ehcache-4.0.1.Final.jar,與項目架構版本一致。

實體層層代碼:

@Entity
@Table(name = "history_station_user")
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class HistoryStationUser {
    @Id
    @Column(name = "id")
    @Type(type = "string")
    private String id;

    @Column(name = "year")
    @Type(type = "int")
    private Integer year;

    @Column(name = "month")
    @Type(type = "int")
    private Integer month;
    ...
}

Dao層代碼:

public List cacheableList(Class target, List criterions) {
    Session session = this.getSession();
    session.clear();
    Transaction tran = session.beginTransaction();

    List list = this.createCriteria(session, target, criterions)//
            .setCacheable(true)//把可緩存設置爲true,二級緩存才能生效
            .list();

    tran.commit();
    session.flush();
    session.close();
    return list;
}

以上爲配置Hibernate4配置二級緩存的步驟。僅演示基於JPA的方法,其餘兩種方法同理也容易配置。


作者: @nanphonfy
Email: nanphonfy (Nfzone) gmail.com 請將(Nfzone)換成@


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章