您的位置:首页 > 其它

hibernate学习笔记(二级缓存)

2012-07-10 12:15 411 查看
有人曾经问过gave king 问他hibernate最值得他骄傲的地方是什么?大家都以为他会说:是他提供的映射文件,面向对象化的操作。

而他却说:最值得骄傲的是他的缓存机制:

hibernate的缓存机制分为一级缓存和二级缓存,一级缓存即sessio级别的。二级缓存是sessionFactory级别的。



在二级缓存中,它不仅可以保存在内存中,还可以保存在硬盘上。当然这种缓存机制主要是针对大量的数据进行操作。如果数据量较少,可以采用一级缓存。

我采用的EhCache缓存。ehcache 是一个非常轻量级的缓存实现。

实现二级缓存

1.导入jar包;两个:asm-attrs.jar,commons-logging-1.1.1.jar.

2.在主配置文件中添加属性:

<!-- 使用二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">
true
</property>
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
3.在映射文件中配置:<cache usage="read-only"/>

注意:在这有4个值:有必要对这4个值进行介绍。

A.transactional:保存可重复的事物隔离级别,对于读/写比例大,很少更新的数据通常可以采用这种方式。

B.read-write:使用timestamp机制维护已提交的事物隔离级别,对于读/写比例大,很少更新的数据通常可以采用这种方式。

C.nonstrict-read-write:二级缓存与数据库中的数据可能会出现不一致的情况。应该设置足够短的缓存过期时间。否则就有可能从缓存中读取到脏数据,当一些数据很少改变(一天,两天都不改变的数据)并且这些数据如果出现数据库与缓存不一致的情况下影响并不大的时候,那么可以采用这种缓存策略。

D.read-only:当确定数据不会被更改时。我们可以使用这种缓存策略。

4.编写ehcache.xml文件。在src目录下新建一个这个文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!-- 如果内存放不下,就放到磁盘上的一个路径 -->
<diskStore path="d:/ehcache"/>
<!-- 内存中存放最多的对象个数 -->
<defaultCache maxElementsInMemory="200" eternal="false"
timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true" />
<!-- 保存的对象 -->
<cache name="com.test.bean.Student" maxElementsInMemory="200" eternal="false"
timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true"/>
</ehcache>
配置基本上就完成了。

然后可以测试了。

Session session1=sessionfactory.openSession();
Transaction tx1=session1.beginTransaction();

List<Student> list=session.createQuery("from Student s order by s.name asc").list();
for(Student stu:list){
System.out.println(stu.getName());
}
tx1.commit();
System.out.println("---------------------------");
Session session2=sessionfactory.openSession();
Transaction tx2=session2.beginTransaction();

Student s1=(Student)session2.get(Student.class, "4028ab81386ed77b01386ed77d57000c");
Student s2=(Student)session2.get(Student.class, "4028ab81386ed77b01386ed77d570011");

System.out.println(s1.getName());
System.out.println(s2.getName());
tx2.commit();
开启两个session和两个transaction。

如果不配置二级缓存的话。它肯定是执行3条sql,但是配置了。就可以将后两条sql省略了。

over...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: