Hibernate缓存的支持和使用情况

开发 后端
本文介绍Hibernate缓存。支持Hibernate缓存的有get,load,iterate和save方法。不要想当然的以为Hibernate缓存一定能提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。

哪些方法支持Hibernate缓存
*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缓存查询测试:开启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列表到二级缓存中取得相应的数据

二级缓存在项目中的集成和使用

1.将echcache.xml文件拷贝到src下, 二级缓存hibernate默认是关闭的,手动开启
2.开启二级缓存,修改hibernate.cfg.xml文件,
< property name=”hibernate.cache.user_second_level_cache”>true< /property>
3.指定缓存产品提供商
< property name=”hibernate.cache.provider_calss”>org.hibernate.cache.EhCacheProvider< /property>
4.指定那些实体类使用二级缓存(两种方法,推荐使用第二种)
***种:在*.hbm.xml中,在< id>之前加入
< cache usage=”read-only” />, 使用二级缓存
第二种:在hibernate.cfg.xml配置文件中,在< mapping resource=”com/Studnet.hbm.xml” />后面加上:
< class-cache class=” com.Studnet” usage=”read-only” />

总结:

不要想当然的以为Hibernate缓存一定能提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的,不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用,可能会有1+N的问题。不当的使用还可能导致读出脏数据。

如果受不了hibernate的诸多限制,那么还是自己在应用程序的层面上做缓存吧。

在越高的层面上做缓存,效果就会越好。就好像尽管磁盘有缓存,数据库还是要实现自己的缓存,尽管数据库有缓存,咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么,只能做的比较通用,而高层可以有针对性的实现缓存,所以在更高的级别上做缓存,效果也要好些吧。

对于性能的看法是:合理的性能而不是***的性能。什么是合理的?用户能感觉到(或敏感的)的范围内,不成为物理上业务处理的瓶颈,比如常说的3秒之内响应等。

【编辑推荐】

  1. Hibernate缓存简介及分类
  2. Hibernate中generator属性的意义
  3. hibernate Key Generator 主键生成方式
  4. Hibernate的主键生成机制
  5. hibernate的Query cache
责任编辑:book05 来源: 博客大巴
相关推荐

2010-10-14 16:10:28

MySQL排序

2017-01-18 21:57:14

2022-07-13 14:26:26

Linux

2015-11-09 15:32:34

TorTor网络隐私网络

2021-12-22 15:13:03

iOS 15Swift二进制

2018-07-06 14:52:49

Docker容器云服务

2010-05-12 15:14:59

subversion管

2021-03-26 07:17:38

Linux命令磁盘

2010-04-16 10:00:06

Oracle查看表空间

2009-06-16 09:18:26

Linux系统管理系统资源

2017-11-30 18:42:22

PythonCPU脚本分析

2010-02-03 17:16:58

Linux内存使用

2010-06-02 11:06:15

Linux 内存监控

2020-02-04 13:50:09

Linux进程内存使用

2020-06-17 14:10:01

Python内存程序

2010-11-16 11:40:04

Oracle查询表空间

2009-12-14 17:25:20

Linux操作系统

2014-04-24 16:26:31

UbuntuUbuntu 磁盘Linux基础

2009-02-03 09:49:00

FTP空间共享

2020-12-07 18:19:46

Common Lisp方言编程
点赞
收藏

51CTO技术栈公众号