Hibernate 之 一级缓存
本篇文章主要是总结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次清空,如果不清空的话会占用大量的内存.会导致效率低下甚至内存溢出.
- /**
- * 大批量的数据添加,需要清空缓存.
- */
- public void testCache() {
- Session session = null;
- try {
- //获取session
- session = sessionFactory.openSession();
- //开启事务
- session.beginTransaction();
- for (int i=0; i<100000; i++) {
- Student student = new Student();
- student.setName("张三" + i);
- session.save(student);
- //每20条更新一次
- if (i % 20 == 0) {
- //将缓存数据放入数据库
- session.flush();
- //清除缓存的内容
- session.clear();
- }
- }
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- session.close();
- }
小结
以上示例是Hibernate中大批量更新数据的做法,但是如果数据量超大,百万级别则建议不要在用Hibernate,而是直接用Jdbc.如果数据量更大则需要相关的数据库工具,如Oracle
SQLLoader特殊工具可以完成数据的快速导入.
一句话总结缓存:为效率而生.
在接下来的文章会对Hibernate的二级缓存进行学习.
Hibernate 之 一级缓存的更多相关文章
- Hibernate的一级缓存
Hibernate的一级缓存 什么是缓存:缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取 缓存的好处:提升程序运行的效率.缓存技术是Hibe ...
- hibernate(二)一级缓存和三种状态解析
序言 前一篇文章知道了什么是hibernate,并且创建了第一个hibernate工程,今天就来先谈谈hibernate的一级缓存和它的三种状态,先要对着两个有一个深刻的了解,才能对后面我要讲解的一对 ...
- hibernate学习(四)hibernate的一级缓存&快照
缓存:提高效率 硬件的 CPU缓存 硬盘缓存 内存 软件的 io流缓存 hibernate 的一级缓存 也是为了操作数据库的效率. 证明一级缓存在 : Person p=sessio ...
- Hibernate之一级缓存和二级缓存
1:Hibernate的一级缓存: 1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据 ...
- hibernate Session一级缓存 应该注意的地方
Session缓存 Hibernate的一级缓存是由Session提供的,因此它存在于Session的整个生命周期中,当程序调用save()/update()/saveOrupdate()/get() ...
- (转)Hibernate的一级缓存
http://blog.csdn.net/yerenyuan_pku/article/details/70148567 Hibernate的一级缓存 Hibernate的一级缓存就是指Session缓 ...
- 【Hibernate】一级缓存
一.概述 二.证明Hibernate的一级缓存的存在 三.一级缓存中快照区 四.管理一级缓存 五.Hibernate一级缓存的刷出时机 六.操作持久化对象的方法 一.概述 什么是缓存: 缓存将数据库/ ...
- JavaWeb_(Hibernate框架)Hibernate中一级缓存
Hibernate中一级缓存 Hibernate 中的缓存分为一级缓存和二级缓存,这两个级别的缓存都位于持久化层,并且存储的都是数据库数据的备份.其中一级缓存是 Hibernate 的内置缓存,在前面 ...
- 四 Hibernate的一级缓存&事务管理及其配置
持久态对象: 自动更新数据库,原理是一级缓存. 缓存:是一种优化的方式,将数据存入内存,从缓存/内存中获取,不用通过存储源 Hibernate框架中提供了优化手段:缓存,抓取策略 Hibernate中 ...
随机推荐
- git 项目相关
工具篇:Sourcetree 和 Git Bash Sourcetree Git一款非常好用的可视化工具,方便管理项目.下载地址 https://www.sourcetreeapp.com/ Git ...
- python_字符串类型
1.在python中用单引号' ',双引号'' '',三引号''' ''' 标注字符串类型. >>> name = "Alex Li" #双引号 >> ...
- SolrCloud架构
原文链接 https://blog.csdn.net/dingzfang/article/details/42804489 1 核心概念 Collection Shard 均为逻辑上的概念 Core为 ...
- sysctl.conf文件配置详解
############################# net.inet.ip.sourceroute=0 net.inet.ip.accept_sourceroute=0 ########### ...
- Java学习之for循环打印菱形练习
for循环语句是Java程序设计中非常有用的循环语句.一个for循环可以用来重复执行某条语句,直到某个条件得到满足.在Java 5新增的加强的foreach语法,也非常有用. 1. for语句 for ...
- UI入门教程
常常会听到这么一些忠告“多看 多想 多做” 你有没有发现一个问题,每天都在看各种设计作品,真到自己做的时候,一下子全都忘记了,脑子短路傻逼了.之前看到那么多好的设计作品也都白看了,人家的还是人家的 ...
- XTU 二分图和网络流 练习题 C. 方格取数(1)
C. 方格取数(1) Time Limit: 5000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d Java class ...
- zoj 2807 Electrical Outlets
Electrical Outlets Time Limit: 2 Seconds Memory Limit: 65536 KB Roy has just moved into a new a ...
- 洛谷P1521 求逆序对 题解
题意: 求1到n的全排列中有m对逆序对的方案数. 思路: 1.f[i][j]表示1到i的全排列中有j对逆序对的方案数. 2.显然,1到i的全排列最多有(i-1)*i/2对逆序对,而对于f[i][j]来 ...
- poj1470 Closest Common Ancestors [ 离线LCA tarjan ]
传送门 Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 14915 Ac ...