`
m635674608
  • 浏览: 4944258 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Hibernate缓存管理

 
阅读更多

Hibernate缓存管理

1.Hibernate缓存分类

1一级缓存Session缓存,它是属于事物范围的缓存,这一级别的缓存由Hibernate管理的,一般情况下无需干预。

2、二级缓存:SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存,这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。

2.Hibernate缓存管理

1、一级缓存的管理:

当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。Session为应用程序提供了两个管理缓存的方法:evict(Object obj):从缓存中清除参数指定的持久化对象。clear():清空缓存中所有持久化对象。

2、二级缓存管理:

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

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

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

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

3.常用的缓存插件

1EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。

2OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。

3SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。

4JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。

4.使用EhCache配置二级缓存的步骤

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

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

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

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

org.hibernate.cache.EhCacheProvider

< /property>

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

4Hibernate允许在类和集合的粒度上设置第二级缓存。在映射文件中,< class>< set>元素都有一个< cache>子元素,这个子元素用来配置二级缓存。

5修改要配置缓存的那个持久化类的对象关系映射文件:

Category.hbm.xml

< ?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="org.qiujy.domain.cachedemo.Category" table="categories">

< !?

配置缓存,必须紧跟在class元素后面

对缓存中的Category对象采用读写型的并发访问策略

-->

< cache usage="read-write"/>

< id name="id" type="java.lang.Long">

< column name="id" />

< generator class="native" />

< /id>

< !-- 配置版本号,必须紧跟在id元素后面 -->

< version name="version" column="version" type="java.lang.Long" />

< property name="name" type="java.lang.String">

< column name="name" length="32" not-null="true"/>

< /property>

< property name="description" type="java.lang.String">

< column name="description" length="255"/>

< /property>

< set name="products" table="products" cascade="all" inverse="true">

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

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

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

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

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

-->

< cache usage="read-write"/>

< key column="categoryId" not-null="true"/>

< one-to-many class="org.qiujy.domain.cachedemo.Product"/>

< /set>

< /class>

< /hibernate-mapping>

6、 编辑ehcache.xml文件

< ehcache>

< diskStore path="c:\\ehcache\"/>

< defaultCache

maxElementsInMemory="10000"

eternal="false"

timeToIdleSeconds="120"

timeToLiveSeconds="120"

overflowToDisk="true"

/>

< !-- 设置Category类的缓存的数据过期策略 -->

< cache name="org.qiujy.domain.cachedemo.Category"

maxElementsInMemory="100"

eternal="true"

timeToIdleSeconds="0"

timeToLiveSeconds="0"

overflowToDisk="false"

/>

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

< cache name="org.qiujy.domain.cachedemo.Category.products"

maxElementsInMemory="500"

eternal="false"

timeToIdleSeconds="300"

timeToLiveSeconds="600"

overflowToDisk="true"

/>

< cache name="org.qiujy.domain.cachedemo.Product"

maxElementsInMemory="500"

eternal="false"

timeToIdleSeconds="300"

timeToLiveSeconds="600"

overflowToDisk="true"

/>

< /ehcache>

配置的元素说明:

元素或属性 描述

< diskStore> 设置缓存数据文件的存放目录

< defaultCache> 设置缓存的默认数据过期策略

< cache> 设定具体的命名缓存的数据过期策略

每个命名缓存代表一个缓存区域,每个缓存区域有各自的数据过期策略。命名缓存机制使得用户能够在每个类以及类的每个集合的粒度上设置数据过期策略。

cache元素的属性

name 设置缓存的名字,它的取值为类的全限定名或类的集合的名字

maxInMemory 设置基于内存的缓存中可存放的对象最大数目

eternal 设置对象是否为永久的,true表示永不过期,此时将忽略timeToIdleSecondstimeToLiveSeconds属性;

默认值是false

timeToIdleSeconds 设置对象空闲最长时间,超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。

如果此值为0,表示对象可以无限期地处于空闲状态。

timeToLiveSeconds 设置对象生存最长时间,超过这个时间,对象过期。

如果此值为0,表示对象可以无限期地存在于缓存中。

overflowToDisk 设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中

5.查询缓存

1、 对于经常使用的查询语句,如果启用了查询缓存,当第一次执行查询语句时,Hibernate会把查询结果存放在第二缓存中。以后再次执行该查询语句时,只需从缓存中获得查询结果,从而提高查询性能。

2、 启用查询缓存的步骤:

1) ehcache.xml中添加如下配置:

< !-- 设置默认的查询缓存的数据过期策略 -->

< cache name="org.hibernate.cache.StandardQueryCache"

maxElementsInMemory="50"

eternal="false"

timeToIdleSeconds="3600"

timeToLiveSeconds="7200"

overflowToDisk="true"/>

< !-- 设置时间戳缓存的数据过期策略 -->

< cache name="org.hibernate.cache.UpdateTimestampsCache"

maxElementsInMemory="5000"

eternal="true"

overflowToDisk="true"/>

< !-- 设置自定义命名查询缓存customerQueries的数据过期策略 -->

< cache name="myCacheRegion"

maxElementsInMemory="1000"

eternal="false"

timeToIdleSeconds="300"

timeToLiveSeconds="600"

overflowToDisk="true"

/>

2) 打开查询缓存:

hibernate.cfg.xml添加如下配置

< !--启用查询缓存 -->

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

3)在程序中使用

对于希望启用查询缓存的查询语句,应该调用Query接口的setCacheeable(true)方法

关键代码如下:

tx = session.beginTransaction();

Query query = session.createQuery("from Product");

//激活查询缓存

query.setCacheable(true);

//使用自定义的查询缓存区域,若不设置,则使用标准查询缓存区域

query.setCacheRegion("myCacheRegion");

List list = query.list();

<!--EndFragment-->
分享到:
评论

相关推荐

    Hibernate缓存管理.doc

    Hibernate缓存管理,全面,易懂...

    Hibernate 缓存管理

    Hibernate 缓存管理 实例,想深入理解Hiberante的朋友,可以去研究一下。

    Hibernate缓存管理[参照].pdf

    Hibernate缓存管理[参照].pdf

    管理Hibernate的缓存

    管理Hibernate的缓存缓存 管理Hibernate的缓存缓存

    hibernate缓存和事务

    hibernate查询,事务管理,缓存等实现。

    hibernate3的缓存管理

    hibernate3的缓存管理

    hibernate 3中的缓存小结

    hibernate 3中的缓存小结 2.2. 一级缓存的管理: 当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在...

    hibernate二级缓存使用范例

    这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 ...

    hibernate事务,并发及缓存管理实例

    通过实例你也许会明白hibernate事务,并发及缓存管理的运行原理,如果对这个感兴趣的可以看看

    Java缓存框架Java缓存框架

    EhCache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。... 支持多缓存管理器实例,以及一个实例的多个缓存区域 9. 提供Hibernate的缓存实现 10. 等等

    springmvc+shiro+spring+hibernate+redis缓存管理示例

    完整的spring +springmvc+hibernate+shiro项目实例,详细的shiro配置介绍,通过redis管理用户session缓存。。。。。。。。

    hibernate基础教程

    在Hibernate中使用两极缓存结构,第一级缓存是Session级别的缓存,Session级别的缓存是由Hibernate管理的,一般情况下无需进行干预.第二级缓存是 SessionFactory级别的缓存,SessionFactory级的缓存可以进行配置和...

    spring hibernate 事务管理学习笔记(二)

    NULL 博文链接:https://microjava.iteye.com/blog/525981

    Java缓存框架 Ehcache.zip

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider... 支持多缓存管理器实例,以及一个实例的多个缓存区域9. 提供Hibernate的缓存实现10. 等等 标签:缓存

    struts2+hibernate的简单学生信息管理

    采用Struts2+Hibernate技术实现的简单信息管理,具有增删该查功能,添加了二级缓存,三级缓存功能,添加了日志功能,仅为初学者学习实用

    基于Struts2、Spring和Hibernate的投票管理系统

    基于S2SH的投票管理系统,可以创建、删除和修改单选和多选投票,涉及到Struts2校验、拦截器、国际化、Spring声明式事务管理,Hibernate缓存等技术

    通用后台管理系统(ExtJS 4.2+Hibernate 4.1.7+Spring MVC 3.2.8)

    4、Hibernate集成二级缓存框架Ehcache。 5、数据库是MySQL、Oracle和SQL Server,Hibernate的Dialect可使程序移植到其他数据库。 6、采用开源的互动地图Javascript库Leaflet,处理自定义在线地图。 7、采用Google ...

    SpringBoot2 整合Ehcache组件,轻量级缓存管理.docx

    Hibernate三级缓存机制简介: 一级缓存 :基于Session级别分配一块缓存空间,缓存访问的对象信息。Session关闭后会自动清除缓存。 二级缓存 :是SessionFactory对象缓存,可以被创建出的多个 Session 对象共享,二...

    Ehcache Java 缓存框架 v3.6.1

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的... 具有缓存和缓存管理器的侦听接口8. 支持多缓存管理器实例,以及一个实例的多个缓存区域9. 提供Hibernate的缓存实现10. 等等

Global site tag (gtag.js) - Google Analytics