hibernate缓存3

七、哪些方法支持缓存

*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列表到二级缓存中取得相应的数据

阅读更多
个人分类: javaEE
想对作者说点什么? 我来说一句

Hibernate缓存深入详解

2011年08月30日 3.53MB 下载

Hibernate缓存.doc

2010年09月08日 33KB 下载

Hibernate缓存策略

2018年03月22日 562KB 下载

深入理解Hibernate缓存

2011年12月31日 775KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭