配置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)換成@