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)。

  @Test
public 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. hibernate之xml映射文件关系维护,懒加载,级联

    一:关系维护 --->inverse默认值false,表示不放弃关系的维护.   --->inverse="true"配置在那一端,表示那一端xml对应的po放弃关系的 ...

  2. dubbo序列化hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决

    dubbo序列化,hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决 转载声明: ...

  3. webpack学习笔记—优化缓存、合并、懒加载等

    除了前面的webpack基本配置,还可以进一步添加配置,优化合并文件,加快编译速度.下面是生产环境配置文件webpack.production.js,与wenbpack.config.js相比其不需要 ...

  4. OC中重写set和get方法、懒加载

    在写OC程序的时候,在很多时候我们会用到重写set或者get方法,重写这两个方法大多是用于刷新数据,比如懒加载. 意思就是说当你去调用set或者get方法时,系统会去调用重写的get或者set方法,这 ...

  5. hibernate懒加载(转载)

    http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下 ...

  6. Hibernate懒加载深入分析

    Hibernate懒加载深入分析 懒加载可以提高性能吗?  不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越. ...

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

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

  8. Hibernate 性能优化之懒加载

    针对数据库中的大数据,不希望特别早的加载到内存中,当用到它的时候才加载 懒加载分为:类的懒加载.集合的懒加载.单端关联的懒加载 类的懒加载    1.在默认情况下,类就是执行懒加载        2. ...

  9. 在webpack中使用Code Splitting--代码分割来实现vue中的懒加载

    当Vue应用程序越来越大,使用Webpack的代码分割来懒加载组件,路由或者Vuex模块, 只有在需要时候才加载代码. 我们可以在Vue应用程序中在三个不同层级应用懒加载和代码分割: 组件,也称为异步 ...

  10. Swift中懒加载(lazy initialization)的实现

    Swift中是存在和OC一样的懒加载机制的,但是这方面国内的资料比较少,今天把搜索引擎换成了Bing后发现用Bing查英文\最新资料要比百度强上不少. 我们在OC中一般是这样实现懒加载初始化的: 1: ...

随机推荐

  1. android私有文件夹的访问

    首先内部存储路径为/data/data/youPackageName/,下面讲解的各路径都是基于你自己的应用的内部存储路径下. 所有内部存储中保存的文件在用户卸载应用的时候会被删除. 一. files ...

  2. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  3. Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。

    近来遇到这样一个错误:Timeout 时间已到.在操作完成之前超时时间已过或服务器未响应.错误截图如下: 错误原因分析:产生错误时我执行的操作需要的执行时间比较长.我测试了一下,那个操作用到的存储过程 ...

  4. python 字符串复制

    通过变量来进行赋值 fstr = 'strcpy'sstr = fstrfstr = 'strcpy2'print sstr

  5. python 字符串编码

    通过字符串的decode和encode方法 1 encode([encoding,[errors]]) #其中encoding可以有多种值,比如gb2312 gbk gb18030 bz2 zlib ...

  6. IOS8Preview-Huge for developer and Massive for everyone else

    IOS8Preview-Huge for developer and Massive for everyone else 不管对于开发者还是用户来说,IOS8都是IOS自发布以来功能最强大的版本,但是 ...

  7. 树莓派 LED+蜂鸣+声音传感器+红外模块组合打造声控/红外控制LED

    昨天搞了控制LED,玩了第一个,剩下的就感觉很简单了,这里记录一下 先来几张照片 玩了蜂蜜模块才发现规律,一般这种模块,都会有三个针脚,VCC(3.3V或5V供电输出针脚).GNC(对应GPIO针脚的 ...

  8. matlab processing for video

    [filename,pathname,fileindex]=uigetfile('*.avi','请选择一个Avi文件'); video_info=aviinfo([pathname filename ...

  9. webkit特有的css属性

    内容参见:http://css-infos.net/properties/webkit 具体的定义网页里有详细说明.做有一些html5的应用的时候如果不能很好的适应手机,可以到这上面去找找方法-web ...

  10. Maven进价:Maven构建系列文章

    Maven:基于Java平台的项目构建.依赖管理和项目信息管理. 1.构建 Maven标准化了构建过程 构建过程:编译.运行单元测试.生成文档.打包和部署 避免重复:设计.编码.文档.构建 2.依赖管 ...