Hibernate 缓存总结

标签: hibernate 缓存 | 发表时间:2014-01-17 17:44 | 作者:iwindyforest
出处:http://www.iteye.com

 

 

一、 一级缓存

1.         一级缓存只缓存整个对象,不能缓存对象属性;

2.         一级缓存是Session级的缓存,不能跨多个Session对象来使用;

3.         Session的load/get方法支持一级缓存的读和写;

4.         Query的list接口只支持一级缓存的写入,不能从一级缓存中读出对象。list接口加载对象要发出SQL;

5.         Query的iterate接口既支持一级缓存的写入,也能从一级缓存中读取对象(如果有的话)。每次用iterate接口查询对象,都要先发SQL加载 查询对象的id列表。如果需要用到某个对象,则根据该对象的id从一级缓存中查询,有则直接加载,没有则发出SQL从数据库加载(这时会出现1+N问 题)。

6.         Session的save方法会将save的对象放入一级缓存中,因此如果要save大批对象,则应该要及时清空一级缓存,可以采用Session的clear()方法。

7.         一级缓存是hibernate 默认使用的,无需配置即可使用。

 

二、  二级缓存

1.       二级缓存也是只能缓存整个对象,不能缓存对象属性,而且对load/get方法、list/iterate方法的在使用上跟一级缓存一样。

2.       与一级缓存不同,二级缓存是SessionFactory级的缓存,它允许多个Session对象之间共用。

3.       使用二级缓存前必须进行一些准备步骤(以EhCache为例):

(1)    需要有EhCache的xml配置文件(设置EhCache的“缓存对象最大数目”、“对象是否不失效”、“对象允许的空闲时间”、“对象的生存时间”及“对象数目超额时是否缓存至磁盘”);

(2)    在总配置文件hibernate.cfg.xml中启用二级缓存(默认开启,无需显示配置):

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

(3)    指定二级缓存的供应商:

<property name= "hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

(4)    指定需要缓存的类及缓存方式(可在hibernate.cfg.xml或对应的类的.hbm.xml中配置):

在hibernate.cfg.xml中配置:

<class-cache usage= "read-only" class= "my.Student"/>

在Student.hbm.xml中配置(必须在配置id前完成):

<cache usage= "read-only"/>

(5)    可以通过Session动态设置是否允许对二级缓存进行读和写,方法是:session.setCacheMode(CacheMode.GET)和session.setCacheMode(CacheMode.PUT)

(6)    SessionFactory的evit()会将一个对象逐处二级缓存。

 

三、  查询缓存

查询缓存是专为Query的list方法设计的。对于iterate()方法,无论是查询对象属性还是对象本身,查询缓存用与不用都没有区别!

1. 用查询缓存查询属性:

(1)    查询缓存必须要在hibernate.cfg.xml中显示启用:

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

(2)    在代码中如果要用到查询缓存(无论是写还是读缓存),都要进行开启操作,可通过Query的setCacheable(true)方法开启;

(3)    查询缓存的生命周期与Session无关(可以跨Session查询),当查询关联的表发生改变,那么查询缓存的生命周期结束(delete、update、modify)

(4)    开启查询缓存,并用Query查询对象的属性(可以是一个或多个)时,采用Query的list方法可以把得到的属性集合写入查询缓存中。如果查询缓存已经有了该对象的属性,那么就不会发出SQL而直接从查询缓存中取出来;

2. 用查询缓存查询对象:

(5)    如果开启查询缓存并通过list接口查询对象,在 首次查询时会发出 SQL 从数据库中获取对象,同时将对象的 id 列表放入查询缓存中;如果再次用查询缓存查询对象,则会根据该对象的id发出SQL从数据库中加载对象(这时会发出N条SQL语句)

(6)    如果同时开启查询和二级缓存,那么(5)中就不会发出N条SQL语句了,而是直接从二级缓存中加载。(此时的list接口有了读二级缓存的能力了!!!)



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hibernate 缓存] 推荐:

Hibernate 缓存

- - ITeye博客
1数据缓存:(date caching) 是一种将数据暂时存于内存缓存去中的技术,缓存通常是影响系统性能的关键因素. 2.ORM的数据缓存策略有3中.   1.事务级缓存:  分为 数据库事务和 应用级事务,是基于Session的生命周期的实现,每个session都会在内部维持一个数据缓存, 随session的创建和消亡.

Hibernate 二级缓存

- - CSDN博客推荐文章
很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了. 我的经验主要来自hibernate2.1版本,基本原理和3.0、3.1是一样的,请原谅我的顽固不化. hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了.

Hibernate 缓存总结

- - 行业应用 - ITeye博客
1.         一级缓存只缓存整个对象,不能缓存对象属性;. 2.         一级缓存是Session级的缓存,不能跨多个Session对象来使用;. 3.         Session的load/get方法支持一级缓存的读和写;. 4.         Query的list接口只支持一级缓存的写入,不能从一级缓存中读出对象.

Hibernate的缓存机制

- - 企业架构 - ITeye博客
缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库与应用程序之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高应用的运行性能. Hibernate的缓存机制. 1.1持久化层的缓存的范围.      持久层设计中,往往需要考虑几个不同层次中的数据缓存策略.

hibernate缓存,一级缓存,二级缓存,查询缓存

- - CSDN博客推荐文章
1、缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库和访问层之间. 2、ORM在进行数据读取时,会根据缓存管理策略,首先在缓冲中查询,如果发现,则直接使用,避免数据库调用的开销. 事务级缓存:当前事务范围内的数据缓存. 应用级缓存:某个应用中的数据缓存. 分布式缓存:多个应用,多个JVM之间共享缓存.

在Spring、Hibernate中使用Ehcache缓存

- - BlogJava-首页技术区
前一篇 http://www.blogjava.net/hoojo/archive/2012/07/12/382852.html介绍了Ehcache整合Spring缓存,使用页面、对象缓存;这里将介绍在Hibernate中使用查询缓存、一级缓存、二级缓存,整合Spring在HibernateTemplate中使用查询缓存.

关于hibernate的缓存使用

- - 开源软件 - ITeye博客
原文地址:http://blog.csdn.net/woshichenxu/article/details/586361. 1.     关于hibernate缓存的问题:. 1.1.1.          基本的缓存原理. Hibernate缓存分为二级,第一级存放于session中称为一级缓存,默认带有且不能卸载.

性能优化之Hibernate缓存讲解、应用和调优

- - CSDN博客系统运维推荐文章
    近来坤哥推荐我我们一款性能监控、调优工具——JavaMelody,通过它让我觉得项目优化是看得见摸得着的,优化有了针对性. 而无论是对于分布式,还是非分布,缓存是提示性能的有效工具.     数据层是EJB3.0实现的,而EJB3.0内部也是通过Hibernate实现的,而Hibernate本身提供了很好的缓存机制,我们只需要学会使用它驾驭它就够了.

hibernate一二级缓存,查询缓存,n+1次查询问题

- - 行业应用 - ITeye博客
在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别)、二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题:.

hibernate缓存机制详细分析(一级、二级、查询缓存,非常清晰明白)

- - 编程语言 - ITeye博客
收藏自:http://www.360doc.com/content/14/0801/16/1073512_398635409.shtml. 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别)、二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题.