博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate 之 一级缓存
阅读量:2182 次
发布时间:2019-05-01

本文共 1634 字,大约阅读时间需要 5 分钟。

本篇文章主要是总结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次清空,如果不清空的话会占用大量的内存.会导致效率低下甚至内存溢出.

[java] 
  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.     }  
  30.   
  31.       

 

小结

 

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

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

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

转载地址:http://gkxkb.baihongyu.com/

你可能感兴趣的文章
Leetcode C++《热题 Hot 100-17》461.汉明距离
查看>>
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-21》581.最短无序连续子数组
查看>>
Leetcode C++《热题 Hot 100-22》2.两数相加
查看>>
Leetcode C++《热题 Hot 100-23》3.无重复字符的最长子串
查看>>
Leetcode C++《热题 Hot 100-24》5.最长回文子串
查看>>
Leetcode C++《热题 Hot 100-28》19.删除链表的倒数第N个节点
查看>>
Leetcode C++《热题 Hot 100-29》22.括号生成
查看>>
Leetcode C++《热题 Hot 100-47》236.二叉树的最近公共祖先
查看>>
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>
阿里云《云原生》公开课笔记 第二章 容器基本概念
查看>>
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>