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缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...
总结来说,Hibernate的缓存机制包括一级缓存和二级缓存,它们协同工作以优化数据库操作。一级缓存是必不可少的,提供事务级别的数据管理;二级缓存则是可选的,用于进一步提升性能,但需要根据数据的特性和访问模式...
Hibernate缓存机制.txt
**描述:**这篇博客主要探讨了Hibernate框架中的缓存机制,包括一级缓存和二级缓存的概念、工作原理以及如何在实际开发中应用。 **标签:“源码 工具”** **知识点详解:** **1. Hibernate概述:** Hibernate是一...
本文将深入探讨Hibernate的缓存机制,包括一级缓存、二级缓存和查询缓存,以及如何配置和使用它们。 一、一级缓存 一级缓存,也称为Session缓存,是Hibernate内置的默认缓存。每当我们在Session中进行持久化操作时...
hibernate缓存机制,你必须学的持久层技术。
本文将深入探讨Hibernate的缓存机制,帮助开发者理解如何有效地利用缓存提高应用性能。 首先,我们需要了解缓存的基本概念。缓存是一种存储技术,用于临时存储经常访问的数据,以减少对主存储器(如硬盘或网络)的...
## Hibernate缓存机制详解 ### 一、缓存分类与管理 Hibernate提供了两种主要的缓存类型:一级缓存和二级缓存。 #### 1. 一级缓存 一级缓存也称为Session缓存,它在同一个Session中对数据的多次读取操作只需要一...
### Hibernate缓存机制详解 #### 一、概述 Hibernate 是一款流行的 Java 持久层框架,它简化了 Java 应用程序与数据库交互的过程。然而,直接使用 JDBC 访问数据库存在一定的性能开销。为了提升性能,Hibernate ...
其中,缓存机制是Hibernate性能优化的重要组成部分之一。理解Hibernate缓存的工作原理及配置方法对于提高应用性能具有重要意义。 在Hibernate中,缓存分为一级缓存(第一级缓存)和二级缓存(第二级缓存)。一级...
这时,Hibernate的缓存机制就显得尤为重要。本篇深入详解将带你了解Hibernate缓存的原理、类型以及最佳实践。 **一、Hibernate缓存概述** Hibernate的缓存机制主要是为了减少对数据库的直接访问,提高系统性能。它...
Hibernate缓存介于Hibernate应用和数据库之间,缓存中存放了数据库数据的拷贝。 其作用是减少访问数据库的频率,从而提高应用的运行性能
Hibernate缓存.docHibernate缓存.doc
### Hibernate缓存技术研究 #### 一、引言 ...总之,Hibernate的缓存机制是提高应用程序性能的关键技术之一。通过对缓存结构的理解以及合理配置缓存策略,可以有效地提高数据访问效率,减少数据库的负担。
Hibernate作为一款流行的Java持久层框架,提供了强大的缓存机制,支持不同级别的缓存来优化数据访问性能。Hibernate缓存主要包括两个层面:一级缓存(第一级缓存)和二级缓存(第二级缓存)。 #### Session的缓存...
**标题:“Hibernate的缓存机制”** 在Java的持久化框架Hibernate中,缓存机制扮演着至关重要的角色,它能够显著提升数据访问的性能。缓存可以分为一级缓存和二级缓存,以及查询缓存。 **一级缓存**: 一级缓存是...