1. 程式人生 > >效能優化之Hibernate4配置二級快取

效能優化之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)換成@