本篇文章主要是总结Hibernate中关于缓存的相关内容.

先来看看什么是缓存,我们这里所说的缓存主要是指应用程序与物流数据源之间(例如硬盘),用于存放临时数据的内存区域,这样做的目的是为了减少应用程序对物理数据源的访问次数,从而提高应用程序的性能.因为读取内存里的数据要远比读取硬盘里的数据快的多.如下图.

上面的缓存是一个比较粗粒度的概念.缓存的机制就是增加了一个缓冲区,cpu中就有缓存的概念.接下来我们来了解一下Hibernate中的缓存运行机制.

在 Hibernate在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候就会从物理数据源中检索.如此一来,把频繁使用的数据加载到缓存区后,就可以大大减少应用程序对物理数据源的访问(IO操作),使得程序的运行性能明显的提升.

在这里需要提一下缓存跟我们以前到了解的Pooling有些类似,例如数据库连接池.他们都是用来临时存放数据的,但是又有着自己各自的特点.

Pooling创建的对象是重量级.里面的东西都一样,例如Connection.

Cache里面的东西都不一样,都有状态.

Hibernate中缓存有两种,一级缓存,二级缓存.本片文章我们重点来了解一级缓存.

Hibernate的一级缓存是由Session来提供的,因为一级缓存只存在Session的生命周期中,所以当关闭Session的时候,此Session所管理的一级缓存也被立刻清除.换句话说,只要你用了Hibernate就用到了Hibernate的一级缓存.因此有时候也叫Hibernate一级缓存为Session级缓存或者事务级缓存.

当然我们可以通过Session提供的一些方法来对一级缓存进行一个管理,主要有四个方法.

evict() :用于将某个对象从Session的一级缓存中清除。

clear() :用于将一级缓存中的对象全部清除。

contains(Object obj) 判断指定的对象是否存在于一级缓存中.

flush() 刷新一级缓存区的内容,使之与数据库数据保持同步.

接下来进行一个示例来展示在大数据量添加的情况下,需要采取一个策略来清空缓存,每20次清空,如果不清空的话会占用大量的内存.会导致效率低下甚至内存溢出.

  1. /**
  2. * 大批量的数据添加,需要清空缓存.
  3. */
  4. public void testCache() {
  5. Session session = null;
  6. try {
  7. //获取session
  8. session = sessionFactory.openSession();
  9. //开启事务
  10. session.beginTransaction();
  11. for (int i=0; i<100000; i++) {
  12. Student student = new Student();
  13. student.setName("张三" + i);
  14. session.save(student);
  15. //每20条更新一次
  16. if (i % 20 == 0) {
  17. //将缓存数据放入数据库
  18. session.flush();
  19. //清除缓存的内容
  20. session.clear();
  21. }
  22. }
  23. session.getTransaction().commit();
  24. }catch(Exception e) {
  25. e.printStackTrace();
  26. session.getTransaction().rollback();
  27. }finally {
  28. session.close();
  29. }

小结

以上示例是Hibernate中大批量更新数据的做法,但是如果数据量超大,百万级别则建议不要在用Hibernate,而是直接用Jdbc.如果数据量更大则需要相关的数据库工具,如Oracle
SQLLoader特殊工具可以完成数据的快速导入.

一句话总结缓存:为效率而生.

在接下来的文章会对Hibernate的二级缓存进行学习.

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

  1. Hibernate的一级缓存

    Hibernate的一级缓存 什么是缓存:缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取 缓存的好处:提升程序运行的效率.缓存技术是Hibe ...

  2. hibernate(二)一级缓存和三种状态解析

    序言 前一篇文章知道了什么是hibernate,并且创建了第一个hibernate工程,今天就来先谈谈hibernate的一级缓存和它的三种状态,先要对着两个有一个深刻的了解,才能对后面我要讲解的一对 ...

  3. hibernate学习(四)hibernate的一级缓存&快照

    缓存:提高效率 硬件的 CPU缓存   硬盘缓存   内存 软件的  io流缓存 hibernate  的一级缓存   也是为了操作数据库的效率. 证明一级缓存在  : Person p=sessio ...

  4. Hibernate之一级缓存和二级缓存

    1:Hibernate的一级缓存: 1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据 ...

  5. hibernate Session一级缓存 应该注意的地方

    Session缓存 Hibernate的一级缓存是由Session提供的,因此它存在于Session的整个生命周期中,当程序调用save()/update()/saveOrupdate()/get() ...

  6. (转)Hibernate的一级缓存

    http://blog.csdn.net/yerenyuan_pku/article/details/70148567 Hibernate的一级缓存 Hibernate的一级缓存就是指Session缓 ...

  7. 【Hibernate】一级缓存

    一.概述 二.证明Hibernate的一级缓存的存在 三.一级缓存中快照区 四.管理一级缓存 五.Hibernate一级缓存的刷出时机 六.操作持久化对象的方法 一.概述 什么是缓存: 缓存将数据库/ ...

  8. JavaWeb_(Hibernate框架)Hibernate中一级缓存

    Hibernate中一级缓存 Hibernate 中的缓存分为一级缓存和二级缓存,这两个级别的缓存都位于持久化层,并且存储的都是数据库数据的备份.其中一级缓存是 Hibernate 的内置缓存,在前面 ...

  9. 四 Hibernate的一级缓存&事务管理及其配置

    持久态对象: 自动更新数据库,原理是一级缓存. 缓存:是一种优化的方式,将数据存入内存,从缓存/内存中获取,不用通过存储源 Hibernate框架中提供了优化手段:缓存,抓取策略 Hibernate中 ...

随机推荐

  1. 条款31:将文件间的编译依存关系降至最低(Minimize compilation dependencies between files)

    NOTE1: 1.支持“编译依存性最小化”的一般构想是:相依于声明式,不要相依于定义式.基于此构想的两个手段是Handle classes 和 Interface classes. 2.程序库头文件应 ...

  2. CTO俱乐部官方群聊-探讨创业和跳槽

     今天,CTO俱乐部官方群,有交流,若干活跃分子探讨了创业和跳槽等相关话题. 感觉质量很不错,就整理了下. 老徐 17:02:00  跳来跳去也不是长久之计,除了涨点工资   张苗苗 17:02:46 ...

  3. python自定义模块导入方法,文件夹,包的区别

    python模块导入,网上介绍的资料很多,方法也众说纷纭.根据自己的实践,感觉这个方法最简单直接,而且可以与主流的python ide生成的工程是一样的. 规则只有三条 1.      严格区分包和文 ...

  4. linux shell管道和xargs的区别

    如上图,加了xargs的话相当于将上一个操作的结果作为命令执行前的操作,不加的话直接先把后面的命令运行一遍再操作

  5. 什么是TLS?

    最近在Istio实验中经常遇到HTTP,HTTPS,TLS等名词,感觉忘得差不多,需要复习一下计算机网络的知识了. 本文参考   http://www.techug.com/post/https-ss ...

  6. bzoj 1432 [ZJOI2009]Function 思想

    [bzoj1432][ZJOI2009]Function Description Input 一行两个整数n; k. Output 一行一个整数,表示n 个函数第k 层最少能由多少段组成. Sampl ...

  7. idea与eclipse项目相互导入的过程

    idea项目导出到桌面 很简单,直接去项目所在目录考出即可,但是考出的项目往往都特别大,这是因为考出之前  我们不要忘记把idea的输出目录删除 每次启动服务器运行idea项目的时候  都会有一个输出 ...

  8. 事件和委托: 第 6 页 .Net Framework中的委托与事件

    原文发布时间为:2008-11-01 -- 来源于本人的百度文章 [由搬家工具导入] .Net Framework中的委托与事件 尽管上面的范例很好地完成了我们想要完成的工作,但是我们不仅疑惑:为什么 ...

  9. loj6158 A+B Problem (扩展KMP)

    题目: https://loj.ac/problem/6158 分析: 先把S串逆置,就是从低位向高位看 我们再弄个T串,S串前面有x个连续的0,那么T串前面也有x个连续的0 第x+1位,满足S[x+ ...

  10. 个人网站开发***云服务器+Linux+域名***

    作为一个改变世界的程序猿,我们不应该只会埋头写程序修bug还得会点别的, 当然如果要是自己搞个网站玩玩,既可以锻炼技术,没事也可以和圈外的朋友吹吹 牛.因为水平有限,就弄一些最基础的看看喽,不喜勿喷. ...