Hibernate 包括二个级别的缓存,默认的总是启用Session级别的一级缓存,可选的 SessionFactory 级别的二级缓存,Session级别的一级缓存,但应用保存持久化实体、修改持久化实体时,Session 并不会立即把这种改变 flush 到数据库中,只有程序显示的调用 flush 方法,或者程序关闭 Session 时才会把这些改变一次性的flush到底层数据库。
<property name="hibernate.cache.use_second_level_cache">true</property>
在开启二级缓存后,还需要配置二级缓存的具体实现,Hibernate 提供了三中缓存实现:
Hibernate.cfg.xml 配置文件中增加如下属性,设置缓存类型:
<property name="hibernate.cache.region.factory_class">[缓存的具体实现类]</property>
要使用 EhCache 缓存,需要复制 Hibernate 目录下的 lib/optional/ehcache 子目录的 jar 包,主要依赖的 jar包如下:
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>
? ?
配置说明如下:
修改要使用缓存的持久化类文件,使用 Hibernate 提供的 @Cache 注解修饰持久化类,或者使用该注解修饰集合属性,也可以在 hibernate.cfg.xml 文件中使用<class-cache…/>元素对指定的持久化类启用二级缓存,示例配置及代码如下:
<class-cache usage="read-only" class="[缓存持久类完成名称]"/>
二级缓存可以设定以下 4 种类型的并发访问策略, 每一种访问策略对应一种事务隔离级别
? ?
public static void main(String[] args) {
Session curSession = hibernateUtils.openSession();
Calendar calendar = Calendar.getInstance(Locale.CHINA);
try {
// 启用了二级缓存,在查询时需要开启事务
curSession.beginTransaction();
List list = curSession.createQuery("SELECT trm FROM TransitRecordModel trm").list();
? ?
System.out.println("Query Size=" + list.size());
curSession.getTransaction().commit();
// 从缓存读取,不查询数据库
TransitRecordModel recordModel = (TransitRecordModel) curSession.load(TransitRecordModel.class,new Integer(259));
System.out.println("RecordID=" + recordModel.getRecordID());
} finally {
if (curSession != null) {
curSession.close();
}
i}
<!-- 开启二级缓存的统计功能 -->
<property name="hibernate.generate_statistics">true</property>
<!-- 设置使用结构化方式来维护缓存项-->
<property name="hibernate.cache.use_structured_entries">true</property>
? ?
? ?
原文:http://www.cnblogs.com/li3807/p/6358387.html