在上篇文章中我们对缓存以及Hibernate的一级缓存进行了介绍,接下来的主要内容将是Hibernate的二级缓存.

二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享,换句话说就是一级缓存可以用二级缓存里的内容.二级缓存的生命周期和SessionFactory(重量级,一个数据库一个SessionFactory)的生命周期一致,SessionFactory可以管理二级缓存.

二级缓存在Hibernate中有自己的实现叫做HashTable,但是不建议用它进行商用,可以用来进行测试.Hibernate的二级缓存有专门的缓存策略提供商(Cache
Providers),例如EHCache,OSCache等.在这篇文章中我们主要介绍一下Hibernate二级缓存EHCache的用法.

二级缓存EHCache的配置和使用.

*将ehcache.xml文件拷贝到src下(在Hibernate3\etc\ehcache.xml路进行.从hibernate相关的例子中找配置文件)如下图:

默认配置.

<defaultCache

maxElementsInMemory="10000"

eternal="false"

timeToIdleSeconds="120"

timeToLiveSeconds="120"

overflowToDisk="true"

/>

配置的解释如下:

<!--缺省配置 可以对类进行单独配置-->

<!--最大对象数目 -->

<!--是否过期 -->

<!--多长时间没有被访问 -->

<!--如果超过限制,则放入磁盘中 -->

可以进行单独配置

<cache name="sampleCache2"

maxElementsInMemory="1000"

eternal="true"

timeToIdleSeconds="0"

timeToLiveSeconds="0"

overflowToDisk="false"

/>

*在hibernate.cfg.xml文件中加入缓存产品提供商

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

* 启用二级缓存,这也是它的默认配置,在hibernate.cfg.xml配置文件中进行启动二级缓存配置.

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

*指定哪些实体类使用二级缓存

可以在映射文件中采用<cache>标签指定或在hibernate.cfg.xml文件中统一指定

注意使用的策略,通常采用read-only和read-write.

例如在配置文件中统一进行配置.(此处笔者将对Student类进行配置)

<class-cacheusage="read-only" class="com.tgb.hibernate.Student"/>

*以上便完成了EHCache的基本配置,接下来便是在具体的代码中运用

例如在两个Session中发Load查询,因为我们配置了二级缓存,所以在第二次Load的过程中不在发出查询语句,而是直接从二级缓存中获取数据.

测试代码如下:

  1. /**
  2. * 二级缓存测试代码
  3. *
  4. */
  5. public class CacheTest extends TestCase {
  6. /**
  7. * 开启二级缓存
  8. * 在两个session中发load查询
  9. */
  10. public void testCache() {
  11. Session session = null;
  12. try {
  13. //获取session
  14. session = HibernateUtils.getSession();
  15. //开启事务
  16. session.beginTransaction();
  17. //第一次用load查询id为1的学生
  18. Student student = (Student)session.load(Student.class, 1);
  19. System.out.println("student.name=" + student.getName());
  20. //提交
  21. session.getTransaction().commit();
  22. }catch(Exception e) {
  23. e.printStackTrace();
  24. session.getTransaction().rollback();
  25. }finally {
  26. HibernateUtils.closeSession(session);
  27. }
  28. try {
  29. session = HibernateUtils.getSession();
  30. session.beginTransaction();
  31. 第二次用load查询id为1的学生
  32. Student student = (Student)session.load(Student.class, 1);
  33. //不会发出查询语句,因为配置二级缓存,session可以共享二级缓存中的数据
  34. //二级缓存是进程级的缓存
  35. System.out.println("student.name=" + student.getName());
  36. session.getTransaction().commit();
  37. }catch(Exception e) {
  38. e.printStackTrace();
  39. session.getTransaction().rollback();
  40. }finally {
  41. HibernateUtils.closeSession(session);
  42. }
  43. }
  44. }

以上便是Hibernate二级缓存的EHCache产品的使用方式.当然二级缓存有着自己适用的场景.

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

1很少被修改的数据

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

3不会被并发访问的数据

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

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

1经常被修改的数据

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

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

总结

缓存是为性能而生,但不要想当然的以为缓存一定能提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的,在不了解原理的情况下乱用,可能会有N+1的问题。不当的使用还可能导致读出脏数据。

Hibernate 之 二级缓存的更多相关文章

  1. Hibernate之二级缓存

                                                            Hibernate之二级缓存 一.简介 Gaving King曾经对别人说,hibern ...

  2. hibernate(九) 二级缓存和事务级别详讲

    序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...

  3. hibernate的二级缓存

    缓存(Cache): 计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数 ...

  4. 不要依赖hibernate的二级缓存

    一.hibernate的二级缓存   如果开启了二级缓存,hibernate在执行任何一次查询的之后,都会把得到的结果集放到缓存中,缓存结构可以看作是一个hash table,key是数据库记录的id ...

  5. SSH整合缓存之-Memcached作为hibernate的二级缓存

    Hibernate本身不提供二级缓存,所以需要使用第三方插件来作为二级缓存:本次使用memcached作为Hiberbate的二级缓存:添加步骤如下: 一.需要安装memcached服务端 1. 下载 ...

  6. Hibernate的二级缓存策略

    Hibernate的二级缓存策略的一般过程如下: 1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次 ...

  7. Java面试题:Hibernate的二级缓存与Hibernate多表查询

    我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...

  8. 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示

    转自:https://blog.csdn.net/eson_15/article/details/51405911 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...

  9. Hibernate的二级缓存(SessionFaction的外置缓存)-----Helloword

    1. 使用 Hibernate 二级缓存的步骤: 1). 加入二级缓存插件的 jar 包及配置文件: I. 复制 \hibernate-release-4.2.4.Final\lib\optional ...

  10. 介绍一下Hibernate的二级缓存

    介绍一下Hibernate的二级缓存 按照以下思路来回答:(1)首先说清楚什么是缓存,(2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存,(3)最后再说 ...

随机推荐

  1. @ApiParam @RequestParam @PathVariable 用法

    文章来源:https://www.cnblogs.com/hello-tl/p/9204279.html 1.@ApiParam ,是注解api的参数 ,也就是用于swagger提供开发者文档 ,文档 ...

  2. PHP 配置文件php.ini文件优化

    PHP 5.3.3 safe_mode = On #控制php中的函数执行比如system() 这个函数可以调用系统目录 比如 rm ,打开这个配置之后,同时把很多文件操作的函数进行了权限控制 saf ...

  3. [BZOJ 3823]定情信物

    题面 定情信物 题解 这题主要考高中物理和数学. 首先定义 \(f[i][j]\) 表示 \(i\) 维超立方体中第 \(j\) 维元素的数量,根据实际意义,我们可以推出递推式: \(f[i][j]= ...

  4. idea 设置系列 各种乱码

    http://blog.csdn.net/u013361445/article/details/51113692 把idea设置的好,才能用的好.

  5. js总结(一):javascript的类型:基本类型、对象和数组

    javascript 类型分为2种,一个是原始值,另一个是复杂值(对象). 一.原始值 5个原始值是:数字,字符,布尔,null,undefined. 9个原生的对象构造函数:Number Strin ...

  6. java数据结构简单点

    java常用的数据结构一 集合框架主要就是Collection和Map: 1.Collection包含了List和Set两大分支. (1)List是一个有序的集合,每一个元素都有它的索引.第一个元素的 ...

  7. HDU-1858-Max Partial Value I,有坑点,不难;

    Max Partial Value I Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Othe ...

  8. PTA 03-树3 Tree Traversals Again (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/667 5-5 Tree Traversals Again   (25分) An inor ...

  9. hdu 2295 dlx重复覆盖+二分答案

    题目大意: 有一堆雷达工作站,安放至多k个人在这些工作站中,找到一个最小的雷达监控半径可以使k个工作人所在的雷达工作站覆盖所有城市 二分半径的答案,每次利用dlx的重复覆盖来判断这个答案是否正确 #i ...

  10. POJ 1080 Human Gene Functions 【dp】

    题目大意:每次给出两个碱基序列(包含ATGC的两个字符串),其中每一个碱基与另一串中碱基如果配对或者与空串对应会有一个分数(可能为负),找出一种方式使得两个序列配对的分数最大 思路:字符串动态规划的经 ...