hibernate缓存3

转载 2012年03月21日 16:33:12

七、哪些方法支持缓存

*get()
*load()
*iterate()  (查询实体对象)

save()

查询缓存只对query.list()起作用

一级缓存测试:

1.Load测试: 在同一个session中发出两次load查询(1)

2.Get测试: 在同一个session中发出两次get查询(1)

3.iterate测试: 在同一个session中发出两次iterator查询(1(id)+N,1(id))

4.Iterate查询属性测试: 同一个session中发出两次查询属性(2次,iterate查询普通属性,一级缓存不会缓存,所以会发出sql)

5.同一个session中先save,再发出load查询save过的数据--save是使用缓存的

6.同一个session中先调用load查询,然后执行sessio.clear()或session.evict(),再调用load查询(2次)

       sessio.clear()或session.evict()可以管理一级缓存,一级缓存无法取消,但可以管理. 上面的语句都会发出sql 因为一级缓存中的实体被清除了

7.向数据库中批量加入1000条数据

       //每一定条数据就强制session将数据持久化,同时清除缓存,避免大量数据造成内存溢出

开启二级缓存测试:

1.开启两个session中发出两次load查询(get与load一样,1次),

2.开启两个session,分别调用load,再使用sessionFactory清楚二级缓存(2次)

3.一级缓存和二级缓存的交互

       session.setCacheMode(CacheMode.GET);    //设置成 只是从二级缓存里读,不向二级缓存里写数据 (2)

       session.setCacheMode(CacheMode.PUT);  //设置成只是向二级缓存里写数据,不读数据 (2次)

开启hibernate查询缓存测试:

1.  开启查询缓存,关闭二级缓存,开启一个session,分别调用query.list  (查询属性)(1次)

2.  开启查询缓存,关闭二级缓存,开启两个session,分别调用query.list  (查询属性)

(1次)第二次没有去查询数据库,因为查询缓存生命周期与session生命周期无关

3.  开启查询缓存,关闭二级缓存,开启两个session,分别调用query.iterate (查询属性)

(2次)第二去查询数据库,因为查询缓存只对query.list()起作用,对query.iterate()不起作用,也就是说query.iterate()不使用查询缓存

4.  关闭查询缓存,关闭二级缓存,开启两个session,分别调用query.list (查询实体对象)      第二去查询数据库,因为list默认每次都会发出查询sql

5.  开启查询缓存,关闭二级缓存,开启两个session,分别调用query.list (查询实体对象)      第二去查询数据库时,会发出N条sql语句,因为开启了查询缓存,关闭了二级缓存,那么查询缓存会缓存实体对象的id,所以hibernate会根据实体对象的id去查询相应的实体,如果缓存中不存在相应的实体,那么将发出根据实体id查询的sql语句,否则不会发出sql,使用缓存中的数据

6.  开启查询缓存,开启二级缓存,开启两个session,分别调用query.list (查询实体对象)      第二不会发出sql,因为开启了二级缓存和查询缓存,查询缓存缓存了实体对象的id列表,hibernate会根据实体对象的id列表到二级缓存中取得相应的数据

对Hibernate缓存的理解

Hibernate的缓存目前比较常见的使用是它的:一级缓存(Session缓存),二级缓存(第三方插件缓存)。 缓存:          缓存就是把当前查询出来或是使用过的对象保存到内存中(一个数...
  • gst6062825
  • gst6062825
  • 2012年05月16日 18:05
  • 474

Hibernate的N+1问题与缓存机制讲解

在面试的过程中我对源码深度的掌握不够,所以对这个问题还是比较有深刻的感触。偶然看见别人写的解释特记录说明下。 一、N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下...
  • fjnpysh
  • fjnpysh
  • 2017年03月10日 00:13
  • 380

hibernate中的缓存的分类及执行过程

hibernate是一个线程对应一个session,一个线程可以看成一个用户。也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和线程绑定了。 hibernate一...
  • Android_MSK
  • Android_MSK
  • 2017年04月06日 20:12
  • 329

Hibernate常用的缓存插件及其使用

Hibernater 的二级缓存是一个插件,下面是几种常用的缓存插件: l EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。 l...
  • huazaichang
  • huazaichang
  • 2013年01月29日 13:50
  • 1393

hibernate 缓存应用概述

Hibernate是一个ORM框架,由于现在多数web应用工作在并发环境中,为了减少应用程序对数据服务器的频繁访问,减少对数据库服务器的形成高负荷。通常需要在web应用中使用缓存机制。这种情况下,Hi...
  • lkx94
  • lkx94
  • 2014年11月30日 23:48
  • 506

Hibernate缓存和加强

Hibernate缓存和加强 懒加载     懒加载(Load On Demand)是一种独特而又强大的数据获取方法 ,是指程序推迟访问数据库,这样做可以保证有时候不必要的访问数据库,因为...
  • q547550831
  • q547550831
  • 2016年02月15日 18:52
  • 1442

Hibernate旅程(八)Hibernate缓存机制--二级缓存

Hibernate二级级缓存 上篇介绍了Hibernate一级缓存,主要是session缓存,session生命周期结束,缓存也就结束。二级缓存相对于一级缓存来说是一个范围更广阔一些,就比你住的地...
  • lovesummerforever
  • lovesummerforever
  • 2014年03月13日 10:51
  • 3626

Hibernate缓存

1、Hibernate缓存概述        缓存是介于物理数据源与应用程序之间,是数据库数据在内存中的 存放临时copy的容器,        其作用是为了减少应用程序对物理数据源访问的次数,从而...
  • zd8582zd
  • zd8582zd
  • 2010年07月22日 19:21
  • 239

HIbernate缓存

  • vastskyjoe
  • vastskyjoe
  • 2009年01月07日 21:15
  • 578

Hibernate缓存~~~~~~

当Session的load()方法试图从数据库中加载一个Customer对象时,Session先判断缓存中是否已经存在这个Customer对象,如果存在,就不需要再到数据库中检索。   Session...
  • w2512149
  • w2512149
  • 2009年08月26日 11:24
  • 260
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate缓存3
举报原因:
原因补充:

(最多只允许输入30个字)