`
iwindyforest
  • 浏览: 229800 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate 缓存总结

 
阅读更多

 

 

一、 一级缓存

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接口有了读二级缓存的能力了!!!)

分享到:
评论

相关推荐

    hibernate缓存总结

    SHH两年工作经验:hibernate缓存总结和优化

    Hibernate缓存技术研究

    Hibernate是一种面向Java环境的ORM工具。系统地分析了Hibernate的缓存结构,并描述了二级缓存的查询过程、缓存策略;同时总结了二级缓存使用中的一些限制,以及使用二级缓存的优化策略。

    hibernate文档总结,技术汇总,PDF版的,hibernate简明参考文档

    hibernate文档总结,技术汇总,PDF版的 如果想复习hibernate,了解hibernate新技术,这个真的很不错....里面介绍了很多hibernate常用的插件,hibernate配置文件,hibernate原理,hibernate缓存机制.你选它,真的没有错.

    Hibernate_二级缓存总结

    一、缓存简介 Cache In Hibernate HIBERNATE 中的 CACHE 有两级 . 一级是在 Session 范围内的 CACHE . 即每个 Session 有自己的一个 CACHE, 当前操作的对象都会被保留在 CACHE 中 . 但是 Session 关闭后这个 CACHE...

    Hibernate 二级缓存 总结整理

    NULL 博文链接:https://jinnianshilongnian.iteye.com/blog/1525884

    hibernate 二级缓存收集、总结、整理

    hibernate 二级缓存原理规律总结,总结、整理了二级缓存方面的实际运用情况

    Hibernate-二级缓存总结 开发技术 - Java.zip

    Hibernate_二级缓存总结 开发技术 - Java.zip

    hibernate的_映射、三态、脏数据、Session缓存

    hibernate的_映射、三态、脏数据、Session缓存,一个高手的总结,个人觉得很厉害,和大家一起分享

    hibernate二级缓存

    这里主要总结一下二级缓存。 1.首先需要在hibernate.cfg.xml中配置,当然需要导入缓存的jar包 &lt;property name="hibernate.cache.use_query_cache"&gt;true &lt;property name="hibernate.cache.provider_class"&gt;org....

    hibernate 缓存机制

    hibernate 的缓存机制 总结,供您参考,希望对你有所帮助

    47-二级缓存 Hibernate-Shiro-MyBatis

    在工作中无处不在的二级缓存,Hibernate -- Shiro -- MyBatis 这三个框架都有二级缓存的技术,总结出详细的配置文档。详解了每步的配置!

    Hibernate学习总结

    学习成长路,Hibernate总结: 1.Hibernate入门优缺点、 2.Hibernate的操作CRUD、 3.主键生成机制、 4.持久化对象的状态、 5.映射一对多关联关系、 6.深入session、 7.懒加载、 8.Hibernate检索策略(fetch抓取策略)、...

    hibernate经验总结

    关于hibernate使用,缓存机制,事物处理等。。。

    EhCache_Hibernate二级缓存配置_详细

    本人在做项目时用到了Hibernate的二级缓存,使用的是EhCache,结合本人自己的理解总结了如何在java web项目中配合Hibernate使用二级缓存,以提高程序的性能,附带需要的文件,参考的文件,和测试类以及说明。

    hibernate非常全面总结文档

    该文档全面的简绍了hibernate的用法和区别,以及热门的一级缓存和二级缓存的简绍

    hibernate总结

    Hibernate的检索方式:(查询/加载) 1. 通过OID加载 session.get(Users.class, 1); * 2. 通过HQL/SQL 检索 hibernate query language (面向对象的查询语言) * a) 不再操纵表,它操纵的是持久化类的对象 b) 面向...

    Hibernate+中文文档

    3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of ...

    hibernate3.2中文文档(chm格式)

    3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of ...

    HibernateAPI中文版.chm

    3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of ...

    Hibernate对象对应关系总结

    本文主要介绍了对象之间的对应关系,包含对象之间一对一,一对多双向,多对多的关系,另外简单介绍了二级缓存和分页

Global site tag (gtag.js) - Google Analytics