1.为什么使用缓存

  hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率。hibernate中有两种类型的缓存:一级缓存和二级缓存。

2.一级缓存

  Hibenate中一级缓存,也叫做session的缓存,当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。

  一级缓存可以在session范围内减少数据库的访问次数,只在session范围有效,session关闭,一级缓存失效。

  session的缓存由hibernate维护, 用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。

特点:

只在当前session范围有效,作用时间短,效果不是特别明显!

在短时间内多次操作数据库,效果比较明显!

list和iterator的区别

list:

一次把所有的记录都查询出来

会放入缓存,但不会从缓存中获取数据

Iterator:

N+1查询; N表示所有的记录总数,即会先发送一条语句查询所有记录的主键(1),再根据每一个主键再去数据库查询(N)

会放入缓存,也会从缓存中取数据

    public void test5()throws Exception{Session session = sf.openSession();session.beginTransaction();User user = new User();user.setUserName("林黛玉");session.save(user);user.setUserName("嘉宝");session.save(user);session.getTransaction().commit();session.close();}

  由于一级缓存的作用,user对象只会被保存一次。

3.二级缓存

Hibernate提供了基于应用程序级别的缓存, 可以跨多个session,即不同的session都可以访问缓存数据。 这个缓存也叫二级缓存。

Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影响代码。如果用户觉得hibernate提供的框架框架不好用,自己可以换其他的缓存框架或自己实现缓存框架。

开启二级缓存:

list() 默认情况只会放入缓存,不会从一级缓存中取,配置查询缓存,可以让list()查询从二级缓存中取数据。

        <!--开启二级缓存--><property name="hibernate.cache.use_second_level_cache">true</property><!--指定使用的缓存框架--><property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property><!--开启查询缓存--><property name="hibernate.cache.use_query_cache">true</property>

  指定需要二级缓存的类:

  如果设置了集合缓存,集合所属的元素对象也要放入二级缓存,即Employee。

        <!--指定哪一些类需要加入二级缓存--><class-cache class="com.juaner.department.Employee" usage="read-only"/><class-cache class="com.juaner.department.Dept" usage="read-only"/><!--集合缓存,集合所属的类型也要放入二级缓存--><collection-cache collection="com.juaner.department.Dept.emps" usage="read-only"/>

  使用二级缓存:

  如果设置了查询缓存,需要手动设置setCacheable(true)。

   @Testpublic void test1(){Session session = sf.openSession();session.beginTransaction();//setCacheable 指定从二级缓存中找,或放入二级缓存,针对list不从一级缓存中取数据的情况//从缓存中读数据,查询条件必须一致//缓存机制为Map<条件,结果>Query query = session.createQuery("from Dept").setCacheable(true);System.out.println(query.list());session.getTransaction().commit();session.close();Session session1 = sf.openSession();session1.beginTransaction();query = session1.createQuery("from Dept").setCacheable(true);System.out.println(query.list());session1.getTransaction().commit();session1.close();}

4.get和load

get: 及时加载,只要调用get方法立刻向数据库查询

load:默认使用懒加载,当用到数据的时候才向数据库查询

5.懒加载

  当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性。

lazy 值

true     使用懒加载

false    关闭懒加载

extra   在集合数据懒加载时候提升效率,在真正使用数据的时候才向数据库发送查询的sql,如果调用集合的size()/isEmpty()方法,只是统计,不真正查询数据!

Hibernate中的一级缓存、二级缓存和懒加载相关推荐

  1. 【mybatis】Mybatis中的一级、二级缓存

    [mybatis]简介 [mybatis]mybatis & mybatis-plus & hibernate的区别 [mybatis]核心成员分析 [mybatis]Mybatis的 ...

  2. lombok中的@Data注解与MyBatis的懒加载机制冲突解决

    使用@Data注解与mybatis的懒加载机制实现一对一关系查询时,发现怎么配置都无效,就是一下都查出来了,根本没有懒加载 1.application.yml配置文件配置如下: # mybatis 配 ...

  3. vue2.0中实现div容器里的内容懒加载

    当全部数据加载完毕时: 有以上组件情况,点击查询更多按钮可实现懒加载功能. 主要看userList组件和父组件就可以了. <template><div id="root&q ...

  4. (10) Hibernate懒加载详解

    懒加载为hibernate中比较常用的特性之一,下面我们详细来了解下懒加载的原理和注意事项 Load()方法的懒加载原理 在Hibernate中,查询方法有两个,分别是get()和load(),这两种 ...

  5. vue中怎么清空tab选项卡的缓存_vuejs 内置组件component实现tab切换懒加载和表单输入框内容的清空...

    最近项目中使用了vue2.0 官网脚手架进行了开发.开发中的踩一些坑一直没有来得及整理.本篇文章就vuejs内置组件component的一些使用进行一些总结. 1.使用component 实现tab切 ...

  6. 系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构...

    系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这 ...

  7. [译]带你揭开Kotlin中属性代理和懒加载语法糖衣

    翻译说明: 原标题: How Kotlin's delegated properties and lazy-initialization work 原文地址: https://medium.com/t ...

  8. 让Spring 3中jsp的数据对象使用懒加载(FetchType.LAZY)与Controller的JSR 303并存

    本文出处:http://blog.csdn.net/chaijunkun/article/details/9083171,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  9. iOS开发UI中懒加载的使用方法

    1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...

  10. hibernate中的一级缓存

    hibernate中的一级缓存 Hibernate提供了两种缓存,这里主要写一级缓存. 第一级缓存是session的缓存,由于Session对象的生命周期通常对应一个数据事务或者一个应用事务,因此它的 ...

最新文章

  1. 26Java中的多态
  2. 二维数组求子数组中最大的和
  3. python-深浅拷贝
  4. 程序员放弃月薪2W的工作,改行做销售,结果垫底,网友:瞎折腾
  5. java sin函数图像_java中怎样绘制正弦函数图象
  6. [HTML] 关于DIV被Flash或表单遮盖的解决方法
  7. socket编程(四)
  8. Spring velocity 中文乱码 解决方案
  9. tcp协议报文和三次握手与四次挥手
  10. Vue源码:mustache模板引擎学习
  11. python第四周作业_马哥2016全新Linux+Python高端运维班第四周作业
  12. linux下socket编程实例
  13. 词干提取(stemming)和词形还原(lemmatization)比较
  14. oracle sla 设置文档,Oracle EBS SLA 详解(转)
  15. 英语中学生测试软件,初中生免费学英语的软件哪个好
  16. 怎样去除EXCEL中的重复行
  17. python3爬虫豆瓣_Python爬虫(3)豆瓣登录
  18. 学java选i5还是i7_选笔记本电脑,到底CPU是要选i5还是i7
  19. 用OSM数据画地图(含代码)
  20. SpringBoot使用com.alibaba.druid.filter.config.ConfigTools对数据库密码加密

热门文章

  1. 腾讯云CDN常见问题
  2. 剪辑师:入门级无水印无片头片尾免费视频剪辑工具
  3. phpstud使用教程_phpstudy使用方法详细图文教程
  4. 周思源《正说三国人物——赵云》
  5. Google浏览器清理缓存快捷键是什么
  6. 【LaTeX入门】15 在文章中添加脚注
  7. 如何让在 LaTeX 中添加脚注,并且文中不出现编号?
  8. 关于win10笔记本电脑插入耳机后依旧外放的问题(亲测戴尔)
  9. 电脑耳机有声外放无声的解决方法
  10. linux gpt转mbr命令,linux GPT转mbr