hibernate笔记--缓存机制之 一级缓存(session缓存)
一级缓存:
又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存:
还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在:

假设现在我要去查询id=1的Book信息:
List<Book> list =(List) session.createQuery("from Book").list();
System.out.println(list.get().getName());
Book book = (Book)session.get(Book.class, );
System.out.println(book.getName());
我这里先查询了所有的Book,打印出了index=0,即id=1的那本书的书名,接着用get方法再次获取了id=1的Book,我们看一下控制台的打印信息:

通过打印信息我们能发现一个现象,当第二次我们使用get(..)方法去查询时,我们如愿得到了书名,但却没有select语句,说明了什么问题?说明了使用get()方法获取id=1的Book时,hibernate并没有去访问数据库,而是在某一个地方就得到了这个id=1的Book的信息,不难发现,我们第一次使用createQuery()时,其实已经得到了这条Book的信息,而hibernate将这些信息放到了一个缓存里,当执行查询语句时,hibernate没有着急的立即访问数据库去查询,而是先到这个缓存里去找找有没有他所要查询的数据,如果有的话,那就皆大欢喜了,不需要访问数据库,提高了效率,而这个缓存.就是我们所说的一级缓存,也叫session缓存.
同时我们也能知道,get方法使用了一级缓存,用get查询数据时,首先检查缓存中是否有该数据,如果有,直接从缓存中获取该数据直接返回,如果没有,再去访问数据库查找.load也支持一级缓存,但是同时load同时也支持延迟加载.要注意.
接下继续测试代码:
List<Book> list =(List) session.createQuery("from Book").list();
System.out.println(list.get().getName());
list =(List) session.createQuery("from Book").list();
System.out.println(list.get().getName())
在代码中,我们执行了两次session.createQuery(),如果只打印一条sql语句,说明list查询也支持一级缓存,打印结果是这样:
很不幸,控制台打印出了两条sql语句,这就说明了:
list查询不支持一级缓存,但list查询会把返回的结果保存到session缓存,同理uniqueResult()查询也是如此.
接下来继续测试:
List<Book> list =(List) session.createQuery("from Book").list();
System.out.println(list.get().getName());
Iterator<Book> iter = session.createQuery("from Book").iterate();
while(iter.hasNext()){
System.out.println(iter.next().getName());
}
这里我们第一次使用list查询得到所有Book信息,然后用iterate查询,得到一个包含所有Book的迭代器集合,那么他会不会支持一级缓存,这是控制台打印的信息:

乍一看,第二次查询的时候依然打出了sql语句,看来iterate查询是不会先去session中查找的了,但是仔细观察第一条sql语句,可以发现,它仅仅查询了Book的id,但依然打印出了每本书的书名.说明了,iterate依然是在缓存中查询的数据,所以,iterate是支持一级缓存的,同样它执行的查询,也会把返回结果保存到session缓存中.
` 现在再来看一下管理session的几个方法.
- session.flush():一般是结合事务对象Transaction用的,用来清理缓存,执行sql,避免内存溢出,假设你要保存十万条数据,你肯定不希望当保存到九万条的时候程序出错,然后事务回滚,导致一条数据都没有保存上,这时候你可以每保存一千条数据就执行一次session.flush(),这样的话,每保存一千条数据,就会执行到数据库,然后清理一下session缓存.
- session.evict(...);从session缓存中干掉你指定的某一个对象.
- session.clear():将当前session缓存中保存的所有对象统统干掉.
下面用代码演示一下evict,和clear方法:
Book book =(Book) session.get(Book.class,);
System.out.println(book.getName());
session.evict(book);
//b表示干掉session中保存的所有对象,当然也包括Book对象
//session.clear()
book =(Book) session.get(Book.class,);
System.out.println(book.getName());
按照我们的设想,由于执行第二次查询之前,我们通过session.evict(book)方法,干掉了book对象,再次查询时会去访问数据库,来看一下控制台打印结果是不是这样的:

果然如此,跟我们料想的一样.
hibernate笔记--缓存机制之 一级缓存(session缓存)的更多相关文章
- atitit。浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结
atitit.浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结 1. 缓存的一些机制 1 1.1. http 304 1 1.2. 浏览器刷新的处理机制 1 1.3. Expir ...
- mybati缓存机制之一级缓存
在月黑风高的某天夜晚,boss chen语重心长的发条了消息给小草说:“小草啊,是时候写写博客来记录平常自己积累的东西了......”.小草一听,平常没有写博客的习惯,在平常开发中只是用笔记记录自 ...
- 缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)
一.JVM内置缓存(值存放在JVM缓存中) 我们可以先了解一下Cookie,Session,和Cache Cookie:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cooki ...
- MyBatis缓存机制(一级缓存,二级缓存)
一,MyBatis一级缓存(本地缓存) My Batis 一级缓存存在于 SqlSession 的生命周期中,是SqlSession级别的缓存.在操作数据库时需要构造SqlSession对象,在对象中 ...
- mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache
1.1 什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 s ...
- NET下三种缓存机制(Winform里面的缓存使用 )
原文(http://www.cnblogs.com/wuhuacong/p/3526335.html)非常感谢伍华聪作者的分享! 缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度 ...
- 解决iframe缓存机制导致页面不清除缓存不刷新页面的bug
在使用iframe时,已有页面嵌套了一个iframe页面,当这个页面提交后再次跳转到本页面时,原本iframe内的页面应该刷新数据的,结果未刷新,需要清除缓存后才刷新. 解决方案: var fresh ...
- java对象中的三种状态和脏检查及刷新缓存机制
瞬时状态 瞬时状态又称临时状态.如果java对象与数据库中的数据没有任何的关联,即此java对象在数据库中没有相关联的记录,此时java对象的状态为瞬时状态,session对于 瞬时状态的ava对象是 ...
- Hibernate——(5)持久化对象和一级缓存机制
一.对象的三种状态 1.暂时态:当对象刚创建,和Session没有发生任何关系时,当程序运行完就即刻消失,被称为暂时态. 2.持久态:当执行如下代码时,对象变为持久态 Emp e = new Emp( ...
随机推荐
- *HDU2254 矩阵乘法
奥运 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...
- 浅谈Js原型的理解
一.js中的原型毫无疑问一个难点,学习如果不深入很容易就晕了! 在参考了多方面的资料后,发现解释都太过专业,对于很多还没有接触过面向对象 语言的小白来说,有理解不了里面的专有名词!如果你没 ...
- ubuntu自定义分辨率
首先说下为啥要专门敲个文章来说明这个问题,因为我最近入手了一台分辨率为3200*1800的高分辨率笔记本,但使用的时候发现现在的操作系统及其诸多软件对高分辨率屏幕的支持真的是太烂,字体发虚或者变得非常 ...
- 安装zookeeper
从zookeeper官方网站下载安装包:zookeeper-3.4.9.tar.gz 解压安装 tar xvf zookeeper-3.4.9.tar.gz -C /usr/java cd /usr/ ...
- Raft 为什么是更易理解的分布式一致性算法
一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...
- Visual Studio 2015 前端开发工作流
Visual Studio 2015 CTP 5,全称为 Visual Studio 2015 Community Technology Preview 5,意为社区技术预览版,之前的版本为:Visu ...
- .Net开发笔记(十四) 基于“泵”的UDP通信(接上篇)
上一篇中说到了“泵”在编程中的作用以及一些具体用处,但没有实际demo,可能不好理解,这篇文章我分享一个UDP通信的demo,大概实现了类似“飞鸽传书”在局域网中文本消息和文件传输的功能.功能不全也不 ...
- 开始用Word 2013来写博客
第一步:如果从未发布过博客文章的话,需要在菜单里面选这里添加博客账号 第二步:选择正确的设置 第三步:写完博客之后,按这里就可以发布了! 如果以后需要写新的博客的话,还可以直接点这里: ...
- 提供程序不支持 DatabaseExists
如果Oracle CodeFirst模式下要用EFProviderWrapperToolkit,那么会报告以下错误: 提供程序不支持 DatabaseExists. 这个错误是因为Oracle Cod ...
- iOS-常用的第三方框架的介绍
写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每 ...