Hibernate的缓存机制
Hibernate的数据缓存根据它的作用范围或生命周期的不同大致分为两种:一级缓存和二级缓存,下面分别说明下两个缓存:
1. 一级缓存
Hibernate的一级缓存作用范围是在同一个session下,也就是在同一个事务级别下,它随着session的销亡而销亡。Hibernate的一级缓存一般情况下是由hibernate自行维护的,如果我们要手动去维护,hibernate也提供了两个方法:
session.evict(Object obj);//将某个特定的的对象从一级缓存中清除出去
Session.clear(); //清除一级缓存中的所有对象
Hibernate一级缓存的实现原理,也是非常简单的,这里针对hibernate2来说明下,在Session接口的实现类SessionImpl中定义了许多的Map对象,这些Map维护这与当前session相关联的所以PO状态,当我们查询实体对象时,会首先根据id和加载类与在对应的Map结构中匹配,如果命中则直接讲结果对象返回,否则到数据库中去加载数据,并将加载对象放入这些Map中进行管理。另外这些Map结构都是私有的,所以说明了一级缓存是随着session的销亡而销亡的。
2. 二级缓存
Hibernate的二级缓存作用范围是一个SessionFactory下的所有session实现共享,其随着SessionFactory的关闭而消亡。
虽然说二级缓存可以带来性能上的优化但是还是要因事而论,比如一个聊天系统里提供一个查看用户历史聊天记录,可能要查询近几个月所有的记录,而且基本上这些记录不可能被共享(本用户只查看自己的记录),如果这里使用缓存管理,并且是多用户并行操作,可想而知会给内存带来什么后果!
Hibernate本身其实并没有对二级缓存提供很好的实现(只提供了一个基于hashtable的简单实现以供调试),而是为众多第三方实现提供了接口。下面来看个基于EHCache的二级缓存配置实现:
1. 导入ehcache.1.2.3.jar包;
2. 配置ehcache.xml;
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000" <!-- 缓存最大数目 -->
eternal="false" <!-- 缓存是否持久 -->
overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时-->
timeToIdleSeconds="300" <!-- 当缓存闲置n秒后销毁 -->
timeToLiveSeconds="180" <!-- 当缓存存活n秒后销毁-->
diskPersistent="false"
diskEXPiryThreadIntervalSeconds= "120"/>
</ehcache>
3. 在Hibernate配置文件中设置:
<!-- 配置 hibernate 二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true
</property>
<property ame="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider
</property>
<!--EndFragment-->
4.在Hbm文件中添加<cache usage="read-only"/>
测试代码:
public static void main(String[] args) {
long star = System.currentTimeMillis();
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
Query query = session.createQuery("from User3");
System.out.println(((User3)query.iterate().next()).getName());
tr.commit();
session.close();
Session session1 = HibernateUtils.getSession();
Transaction tr1 = session1.beginTransaction();
Query query1 = session1.createQuery("from User3");
System.out.println(((User3)query1.iterate().nex()).getName());
tr1.commit();
session1.close();
System.out.println( System.currentTimeMillis() - star +" ms");
}
<!--EndFragment-->
<!--EndFragment-->
分享到:
相关推荐
hibernate缓存机制 hibernate缓存机制 hibernate缓存机制
首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再具体说说Hibernate中缓存的分类情况,最后可以举个具体的例子。 Hibernate缓存的作用: Hibernate是一个持久层框架
Hibernate缓存机制探讨
Hibernate缓存机制.txt
Hibernate缓存机制研究与应用,详细解释了hibernate的缓存机制及其使用。
Hibernate缓存机制探讨.doc
Hibernate缓存机制的简单解释,可以下载去看看
hibernate缓存机制分析共17页.pdf.zip
hibernate缓存机制,你必须学的持久层技术。
Hibernate缓存介于Hibernate应用和数据库之间,缓存中存放了数据库数据的拷贝。 其作用是减少访问数据库的频率,从而提高应用的运行性能
深入理解hibernate缓存,不再惧怕hibernate缓存...
Hibernate的缓存机制
主要介绍了Hibernate缓存机制实例代码解析,介绍了查询缓存,一级二级缓存等内容,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
Hibernate缓存.docHibernate缓存.doc
Hibernate缓存机制对Hibernate的性能发挥一直处于一个极其重要的作用,它是持久层性能提升的关键。 hibernate缓存在应用系统中的位置 Hibernate缓存介于Hibernate应用和数据库之间,缓存中存放了数据库数据的...
hibernate的缓存机制和session对象的产生方式案例,里面写到session的两种产生方式,和hibernate的缓存机制:一级缓存、二级缓存、查询缓存
Java Hibernate缓存深入详解
Hibernate缓存深入详解,详细介绍Hibernate缓存机制。 1.Hibernate缓存概述 2.Hibernate一级缓存(Session缓存) 3.Hibernate二级缓存 4.查询缓存 5.二级缓存的高级应用(分布式缓存)
Hibernate 缓存 深入 详解 ITEye