`

Hibernate缓存机制(四)

阅读更多
Hibernate缓存是一种提高系统性能的比较好的工具,如果使用合理,则能极大地提高系统性能,但如果使用不合理也会使用系统性能下降。Hibernate缓存比较复杂,要想灵活使用hibernate缓存,必须深入研究hiberante缓存原理,最好能分析hibernate的源代码。有很多人使用hibernate的时间比较长也不能正确理解hibernate缓存,下面我就谈谈hibernate缓存的使用,希望能对大家有点帮助。

Session缓存(一级缓存):当调用Session的保存、更新、查询操作时,在Session缓存中不存在相应对象,则把这些对象加入Session缓存。同一个Session操作,第一次通过ID调用load()或get()查询持久对象,先从Session缓存中查询发现该对象不命中,随即发送一条SQL语句生成一个持久对象并把该对象放入Session缓存。第二次再通过相同ID调用load()或get()查询时将直接从Session缓存将该对象返回,避免多余的数据库连接和查询的开销。

Session的load()和get()方法使用区别:

1、当数据库不存在对应ID数据时,调用load()方法将会抛出ObjectNotFoundException异常,get()方法将返回null,我比较喜欢使用get()方法。

2、当对象.hbm.xml配置文件<class>元素的lazy属性设置为true时,调用load()方法时则返回持久对象的代理类实例,此时的代理类实例是由运行时动态生成的类,该代理类实例包括原目标对象的所有属性和方法,该代理类实例的属性除了ID不为null外,所在属性为null值,查看日志并没有Hibernate SQL输出,说明没有执行查询操作,当代理类实例通过getXXX()方法获取属性值时,Hiberante才真正执行数据库查询操作。当对象.hbm.xml配置文件<class>元素的lazy属性设置为false时,调用load()方法则是立即执行数据库并直接返回实体类,并不返回代理类。而调用get()方法时不管lazy为何值,都直接返回实体类。

3、load()和get()都会先从Session缓存中查找,如果没有找到对应的对象,则查询Hibernate二级缓存,再找不到该对象,则发送一条SQL语句查询。关于这点,很多资料说明get ()不会查询二级缓存,比如夏昕编著的《深入浅出Hibernate》245页描述get()方法不查询二级缓存。但我测试发现load()和get()方法都会查询二级缓存,我上网看了很多缓存方面资料也证实了这点,大家可以看看这篇文章:http://blog.csdn.net/woshichenxu/archive/2006/01/22/586361.aspx
Session的evict()方法将持久对象从Session缓存中清除,clear()方法将清空整个缓存。

二级缓存(SesionFactory): 二级缓存由SessionFactory创建的所有Session对象共享使用, 二级缓存可使用第三方的缓存插件,如EHCache、OSChahe、SwarmCache、JBossCache,下面分别介绍二级缓存的类缓存、集合缓存和查询缓存。

1、类缓存:类缓存的key是持久对象的ID,value为持久化对象POJO,无论调用list(),load()还是iterate()查询,只要读出一个持久化对象POJO,都会根据POJO的ID作为key,value为POJO填充到类缓存中。当通过iterate()方法查询时,先会向数据库发送一条select id from POJO的SQL语句,将所有ID查询出来,再根据ID一个个地作为key到类缓存中查询相应POJO,如果类缓存中存在(命中),则从缓存中返回,否则向数据库发一条select * from POJO  where  id=?语句将查询该对象返回,并填充到类缓存中。当通过list()方法查询时,不会象iterate()先查询ID再查询类缓存,而是直接发送SQL查询数据库将结果返回,但会将查询结果填充到类缓存中,可供itetator()使用。

配置类缓存的同步策略:在hibernate中启动二级类缓存,需要在hibernate.cfg.xml配置以下参数:

<hibernate-configuration>

 <session-factory>
    ……
    <property name=”hibernate.cache.provider_class”>
     org.hibernate.cache.EhCacheProvider
<./property>
 </session-factory>
</hibernate-configuration>
 在这里以EHCache配置为例,如果用spring的applicationContext.xml配置,参数为:
<beans>
    <bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
   ……
   <property name="hibernateProperties">
    ……
    <prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
……
</bean>
</beans>
在这还需要对EHCache进行配置,ehcache.xml配置为:
<ehcache>
 <diskStore path="java.io.tmpdir"/>
 <defaultCache
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="10000" 
    timeToLiveSeconds="10000" 
    overflowToDisk="true" 
 /> 
  <cache  name="com.hour41.hibernate.vo.common.City"
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="10000" 
    timeToLiveSeconds="10000" 
    overflowToDisk="true" 
 />
</ehcache>

上面配置了默认类缓存和城市类缓存策略:

<diskStore>表示当内存缓存中对象数量超过类设置内存缓存数量时,将缓存对象写到硬盘,path=”java.io.tmpdir”表示把数据写到这个目录下。Java.io.tmpdir目录在运行时会根据相对路径生成。
<defaultCache>表示设定缓存的默认数据过期策略。
<cache>表示设定用具体的命名缓存的数据过期策略。
name表示具体的缓存命名。
maxElementsInMemory表示cache中最大允许保存的对象数据量。
eternal表示cache中数据是否为常量。
timeToIdleSeconds表示缓存数据钝化时间
timeToLiveSeconds表示缓存数据的生命时间。
overflowToDisk表示内存不足时,是否启用磁盘缓存。

Hibernate提供了四种缓存同步策略:

read-only策略:只读,对于数据库表的数据不会改变的数据,可以使用只读型缓存。例如城市表的数据不会发生变化,则可配置类缓存为:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.hour41.hibernate.vo.common.City" table="tbl_city" lazy="false" mutable="false">
       <cache usage="read-only" />
        <id name="id" type="java.lang.Integer">
            <column name="cityId" />
            <generator class="native"></generator>
        </id>
        <property name="cnName" type="java.lang.String">
            <column name="cityCnName"/>
        </property>
        <property name="enName" type="java.lang.String">
            <column name="cityEnName"/>
        </property>
        <property name="provinceId" type="java.lang.Integer">
            <column name="provinceId" />
        </property>
   </class>
</hibernate-mapping> 

nonstrict-read-write策略:如果程序对并发数据修改要求不是非常严格,只是偶尔需要更新数据,可以采用本选项,以减少无谓的检查,获得较好的性能。
read-write策略:严格可读写缓存。
transactional策略:事务型缓存。

 

分享到:
评论

相关推荐

    hibernate缓存机制

    Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...

    HIBERNATE的缓存机制

    Hibernate缓存机制是提高应用程序性能的关键特性,尤其是在频繁与数据库交互的应用中。缓存通过减少对物理数据库的直接访问次数,显著提升了数据读取和写入的速度。这主要是因为从缓存中读取数据比从数据库中获取更...

    Hibernate缓存机制.txt

    Hibernate缓存机制.txt

    Hibernate缓存机制,转载

    **标题:“Hibernate缓存机制,转载”** **描述:**这篇博客主要探讨了Hibernate框架中的缓存机制,包括一级缓存和二级缓存的概念、工作原理以及如何在实际开发中应用。 **标签:“源码 工具”** **知识点详解:*...

    Hibernate缓存机制

    h​i​b​e​r​n​a​t​e​缓​存​机​制​,​你​必​须​学​的​持​久​层​技​术​。

    hibernate缓存机制分析共17页.pdf.zip

    《Hibernate缓存机制详解》 Hibernate,作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。其缓存机制是优化性能的关键组成部分,它减少了对数据库的直接访问,提高了数据处理效率。本文...

    Hibernate缓存机制探讨.doc

    ### Hibernate缓存机制详解 #### 一、概述 Hibernate 是一款流行的 Java 持久层框架,它简化了 Java 应用程序与数据库交互的过程。然而,直接使用 JDBC 访问数据库存在一定的性能开销。为了提升性能,Hibernate ...

    Hibernate缓存机制解说

    ## Hibernate缓存机制详解 ### 一、缓存分类与管理 Hibernate提供了两种主要的缓存类型:一级缓存和二级缓存。 #### 1. 一级缓存 一级缓存也称为Session缓存,它在同一个Session中对数据的多次读取操作只需要一...

    Hibernate缓存机制探讨

    在配置Hibernate缓存时,需要明确哪些实体或查询结果应该缓存,并设置相应的缓存策略。例如,我们可以使用`@Cacheable`注解标记实体类,使用`@Cache`注解来定义缓存区域和策略。同时,对于查询结果的缓存,可以使用`...

    Hibernate缓存深入详解 from ITEye

    **Hibernate缓存深入详解** 在Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的扩大,数据访问性能成为了一个不可忽视的问题。这时,...

    Hibernate缓存机制深入浅出

    Hibernate缓存介于Hibernate应用和数据库之间,缓存中存放了数据库数据的拷贝。 其作用是减少访问数据库的频率,从而提高应用的运行性能

    Hibernate缓存技术研究

    ### Hibernate缓存技术研究 #### 一、引言 Hibernate是一种强大的对象-关系映射(Object-Relational Mapping,简称ORM)工具,主要用于Java环境下的应用程序。它能够将应用程序中的对象模型映射到关系型数据库的表...

    Hibernate的缓存机制

    ### Hibernate的缓存机制 #### 缓存的基本概念 缓存技术在软件开发中扮演着重要的角色,尤其是在提高数据访问效率方面。缓存通常被放置在应用程序与物理数据源(如数据库)之间,目的是减少对物理数据源的访问频率...

    hibernate的缓存机制

    **标题:“Hibernate的缓存机制”** 在Java的持久化框架Hibernate中,缓存机制扮演着至关重要的角色,它能够显著提升数据访问的性能。缓存可以分为一级缓存和二级缓存,以及查询缓存。 **一级缓存**: 一级缓存是...

Global site tag (gtag.js) - Google Analytics