Hibernate缓存机制
1 、事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,缓存内的数据通常采用相互关联的的对象形式。
2 、进程范围:缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据,所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。松散的对象数据形式有点类似于对象的序列化数据,但是对象分解为松散的算法比对象序列化的算法要求更快。
3 、集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式。对大多数应用来说,应该慎重地考虑是否需要使用集群范围的缓存,因为访问的速度不一定会比直接访问数据库数据的速度快多少。持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,还可以到进程范围或集群范围的缓存内查询,如果还是没有查到,那么只有到数据库中查询。事务范围的缓存是持久化层的第一级缓存,通常它是必需的;进程范围或集群范围的缓存是持久化层的第二级缓存,通常是可选的。
Hibernate为二级缓存提供了四种策略,每一种策略对应一种事务隔离级别。
一级缓存管理
-1 evict(obeject o):从缓存中清楚参数制定的持久化对象
-2 clear():清空缓存中所有持久化对象
Session的evict()方法能够从缓存中清除特定的持久化对象,它适用于以下情况:
不希望Session继续按照该对象的状态变化俩同步更新数据库
在批量更新或者批量删除的场合,当更新或删除一个对象后,及时释放该对象占用的内存。
当Session的evict方法把一个student对象从缓存中清除的时候,如果Session再次加载OID相同的student对象,他会重新创建一个student对象。
tx=session.beginTransaction();
Student student1 = (Student)session.load(Student.class, 1);
session.evict(student1);
Student student2 = (Student)session.load(Student.class, 1);
system.out.println(student1==student2); //打印 结 果 为 false
System.out.println(session.contains(student1)); //打印 结 果 为 false
System.out.println(session.contains(student2));//打印 结 果 为 true
student2.setAge(19);
student1.setAge(18);
tx=commit();
二级缓存管理
缓存插件 | 只读型 | 非严格读写型 | 读写型 | 事务型 |
EhCache | 支持 | 支持 | 支持 | 否 |
OSCache | 支持 | 支持 | 支持 | 否 |
SwarmCache | 支持 | 支持 | 否 | 否 |
JBossCache | 支持 | 否 | 否 | 支持 |
缓存插件 | 提供器(CacheProvider) |
EhCache | org.hibernate.cache.EhCacheProvider |
OSCache | org.hibernate.cache.OSCacheProvider |
SwarmCache | org.hibernate.cache.SwarmCacheProvider |
JBossCache | org.hibernate.cache.TreeCacheProvider |
配置二级缓存的主要步骤:
选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。
选择合适的缓存插件,然后编辑该插件的配置文件。
原文:http://blog.csdn.net/yujin753/article/details/44628437