`
wx1568844008
  • 浏览: 5396 次
文章分类
社区版块
存档分类
最新评论

Hibernate 缓存

 
阅读更多

一级缓存是Session级别的缓存,Hiberante来管理的,这个一般不用管,

二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载

 

一级缓存的管理

当应用程序调用Sessionsave()update()savaeOrUpdate()get()load(),以及调用查询接口的list()iterate() 方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。

Session为应用程序提供了两个管理缓存的方法:

evict(Object obj):从缓存中清除参数指定的持久化对象。

clear():清空缓存中所有持久化对象。

 

二级缓存的管理

Hibernate的二级缓存策略的一般过程如下:

1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。

2) 把获得的所有数据对象根据ID放入到第二级缓存中。

3) Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。

4) 删除、更新、增加数据的时候,同时更新缓存。

什么样的数据适合存放到第二级缓存中?

1 很少被修改的数据

2 不是很重要的数据,允许出现偶尔并发的数据

3 不会被并发访问的数据

4 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

不适合存放到第二级缓存的数据?

1 经常被修改的数据

2 财务数据,绝对不允许出现并发

3 与其他应用共享的数据。

 

使用ehcache配置二级缓存

步骤:

1) ehcache-1.2.3.jar加入到当前应用的classpath中。

2) hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。

<!—开启缓存-->

   <property name="hibernate.cache.use_query_cache">true</property>

<!--配置缓存插件 -->

    <property name="hibernate.cache.provider_class">  

    org.hibernate.cache.EhCacheProvider

    </property>   

3) 拷贝ehcache.xml文件到类路径(项目工程的src目录下),这个文件在Hibernate安装目录的etc

 

 

 

 

 

 

 

 

在需要缓存的实体bean配置文件中加入缓存配置项

<?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 package=“com.tfsoftware.hibernate.model.Dept">

 

    <class name=“Dept" table=“dept">

 <!— 配置缓存,必须紧跟在class元素后面对缓存中的Dept对象采用读写型的并发访问策略 -->

                <cache usage="read-write" region="com.tfsoftware.hibernate.model.Dept "/>

 

  <id column="deptID" name="deptID" type="integer">

<generator />

</id>

<property column="deptName" length="50" name="deptName"

not-null="true" type="string" />

 

<set name="employees" cascade="save-update" inverse="true">

<!-- Hibernate只会缓存对象的简单属性的值,

       要缓存集合属性,必须在集合元素中也加入<cache>子元素

       Hibernate仅仅是把与当前持久对象关联的对象的OID存放到缓存中。

如果希望把整个关联的对象的所有数据都存入缓存,

则要在相应关联的对象的映射文件中配置<cache>元素 -->

  <cache usage="read-write"/>

<key>

<column name="deptID" not-null="true"/>

</key>

<one-to-many

class="com.tfsoftware.hibernate.model.Employee" />

</set>

</class>

</hibernate-mapping>

   说明:usage说明了缓存的策略,region指定缓存的区域名

 

Ehcache默认的配置文件ehcache.xml(放在类路径下)

<ehcache>

    <diskStore path="D:\cache"/>

    <defaultCache  maxElementsInMemory="1000“  eternal="false“ overflowToDisk="true"

        timeToIdleSeconds="120"

        timeToLiveSeconds="180"

        diskPersistent="false"

        diskExpiryThreadIntervalSeconds="60"/>

<!-- 设置Dept类的employee集合的缓存的数据过期策略 -->

<cache name=" com.tfsoftware.hibernate.model.Dept.employees"

maxElementsInMemory="100"

    eternal="false"

    overflowToDisk="true"

    timeToIdleSeconds="300"

    timeToLiveSeconds="600"

    diskPersistent="false"/>

</ehcache>

 

Ehcache默认的配置文件ehcache.xml

说明:

    defaultCache节点为缺省的缓存策略

     maxElementsInMemory 内存中最大允许存在的对象数量

     eternal 设置缓存中的对象是否永远不过期

     overflowToDisk 把溢出的对象存放到硬盘上

     timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉

     timeToLiveSeconds 指定缓存对象总的存活时间

     diskPersistent jvm结束是否持久化对象

     diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间

 

二级缓存:

    1>准备工作:
    (1)需要copy commons-logging-1.0.4 jar包到lib目录中

2>在cfg文件中配置:
    <!—开启缓存-->
   
    <property name="hibernate.cache.use_query_cache">true</property>
    
<!--配置缓存插件 -->
    
    <property name="hibernate.cache.provider_class">
        org.hibernate.cache.EhCacheProvider
 
    </property>
3>需要在hbm文件中配置:(谁需要放入二级缓存就在谁的映射中写以下配置,如果是主从表关系那么主表中的set想要有从表数据的话必须在从表映射中也要加以下配置)
     <!— 配置缓存,必须紧跟在class元素后面,?对缓存中的Dept对象采用读写型的并发访问策略?-->
                
    <cache usage="read-write" region="com.tfsoftware.hibernate.model.Dept "/>
4>需要把E:\course\jsp\Hibernate\hibernate-distribution-3.3.2.GA\project\etc目录下的ehcache.xml文件copy到src目录里
    <ehcache>        
    <diskStore path="D:\cache"/>        
    <defaultCache  
            maxElementsInMemory="1000“  eternal="false“ overflowToDisk="true"                               
            timeToIdleSeconds="120"
      
            timeToLiveSeconds="180"
        
        diskPersistent="false"
        
        diskExpiryThreadIntervalSeconds="60"/>
    <!-- 设置Dept类的employee集合的缓存的数据过期策略 -->
    
<cache name=" com.tfsoftware.hibernate.model.Dept.employees" maxElementsInMemory="100"
                
            eternal="false"
            overflowToDisk="true"
    
            timeToIdleSeconds="300"
    
            timeToLiveSeconds="600"
    
            diskPersistent="false"/>
    
</ehcache>    
    defaultCache节点为缺省的缓存策略
     
    maxElementsInMemory 内存中最大允许存在的对象数量
     
    eternal 设置缓存中的对象是否永远不过期
     
    overflowToDisk 把溢出的对象存放到硬盘上
     
    timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉
     
    timeToLiveSeconds 指定缓存对象总的存活时间
     
    diskPersistent 当jvm结束是否持久化对象
     
    diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间


转载于:https://my.oschina.net/u/2353689/blog/476087

分享到:
评论

相关推荐

    深入理解Hibernate缓存

    ### 深入理解Hibernate缓存 #### 一、Hibernate缓存概述 Hibernate作为一款流行的Java持久层框架,为开发者提供了高效且灵活的数据访问能力。其中,缓存机制是Hibernate性能优化的重要组成部分之一。理解Hibernate...

    Hibernate缓存深入详解 from ITEye

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

    Hibernate缓存技术研究

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

    Hibernate缓存.doc

    Hibernate缓存.docHibernate缓存.doc

    Java Hibernate缓存深入详解

    Java Hibernate缓存深入详解

    hibernate缓存

    ### Hibernate缓存机制及优化策略 #### 一、概述 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域被广泛应用于数据库操作。它提供了丰富的缓存机制来提高应用性能并降低数据库访问压力。本文将...

    Hibernate缓存与spring事务详解

    **标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...

    hibernate缓存机制

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

    hibernate缓存深入详解.

    关于hibernate缓存的一个ppt课件,60+幻灯片,有需要的可以看一下

    Hibernate缓存深入详解

    【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...

    Hibernate缓存详解

    **Hibernate缓存详解** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了提高数据访问性能,Hibernate引入了缓存机制,它可以减少对数据库的直接访问,从而提升应用的...

    Hibernate缓存,性能优化

    本文将深入探讨Hibernate缓存的原理、类型及其对性能优化的影响。 ### Hibernate缓存原理 Hibernate缓存主要分为一级缓存和二级缓存。一级缓存,也称为会话缓存(Session Cache),是默认启用的,由Hibernate自动...

    hibernate缓存和事务

    Hibernate 是一个流行的对象关系映射(ORM)框架,它允许Java...通过理解Hibernate缓存和事务管理,以及如何有效地执行查询,开发者可以创建高效、健壮的Java应用程序,降低与数据库交互的复杂性,同时提升系统性能。

    Hibernate教程25_Hibernate缓存

    **标题解析:** "Hibernate教程25_Hibernate缓存" 这个标题表明了我们要讨论的是关于Hibernate框架的第25个教程,重点是它的缓存机制。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发者用面向对象的...

    Hibernate缓存管理.doc

    【Hibernate缓存管理】是数据库持久化框架Hibernate中优化性能的关键技术。缓存的主要目的是减少对数据库的直接访问,提高应用程序的运行效率。缓存的数据是数据库中数据的副本,存在于内存或硬盘中,便于快速读取。...

    hibernate缓存ehcache用法

    这篇博客文章“hibernate缓存ehcache用法”可能详细介绍了如何在Hibernate中配置和使用Ehcache。 首先,我们需要理解什么是缓存。缓存是一种存储技术,用于临时保存经常访问的数据,以减少对主存储器(如数据库)的...

    hibernate 缓存

    【Hibernate缓存详解】 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。其缓存机制是提升系统性能的关键所在。本篇将深入探讨Hibernate的缓存机制,包括一级缓存和二级...

Global site tag (gtag.js) - Google Analytics