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