hibernate之缓存
1. 缓存概念:应用数据库访问数据库的代价很高,利用持久化的缓存可以减少与数据库之间的交互,可以从缓存中读取。
注意:缓存使用不当,会造成性能的损失。要在正确使用缓存的前提下,适当情况使用缓存。
2. 持久化缓存的级别:
(1)事务级别:
缓存对象只能被当前事务使用,每个事务都有自己的缓存。事务结束,缓存也结束。
缓存数据以关联对象的形式保存,使用内存作为介质,hibernate的一级缓存即是事务级别。
(2)应用(进程)级别:
可被当前应用(进程)的所有事务访问。
分布式应用不能使用该级缓存,使用内存或硬盘作为储存介质。hibernate的二级缓存可以是此。
(3)分布式级别:
若应用部署在多台服务器的分布式(集群)环境下,数据可被多台服务器共享。
要慎重使用该级别的缓存,多台服务器同步缓存可能会消耗大量的带宽。hibernate的二级缓存也可以是此 。
3. hibernate的一级缓存
(1)概念:是内置缓存,不能人为地取消,也称session缓存。事务级别的缓存,若一次事务多次修改对象,提交时只会执行一条语句,更新所有的修改。
(2)实现原理:可以把一级缓存想象为session对象维护的一个map对象,保存session使用过的对象,session读取数据时先依据对象的类型和标识符属性查找,没有在读数据库,同时保存在map中。
(3)管理一级缓存:
使用session.evict() 方法移除缓存对象,使之变为托管状态。
使用session.clear()方法清除缓存中的所有对象。
使用session的contains()判断是否在一级缓存中, flush()同步数据与数据库一致,setReadOnly()设置为只读对象(不执行脏数据检查)
4. hibernate的二级缓存
(1)概念:由SessionFactory对象管理,应用级别缓存,又称为SessionFactory缓存。会被整个应用的session共享。先一级,在二级。
(2)二级缓存组件:hibernate没有自己的二级缓存组件
组件 |
Provider类 |
类型 |
集群 |
查询缓存 |
Hashtable |
org.hibernate.cache.HashtableCacheProvider |
内存 |
不支持 |
支持 |
EHCache |
org.hibernate.cache.EhCacheProvider |
内存,硬盘 |
不支持 |
支持 |
OSCache |
org.hibernate.cache.OSCacheProvider |
内存,硬盘 |
不支持 |
支持 |
SwarmCache |
org.hibernate.cache.SwarmCacheProvider |
集群 |
支持 |
不支持 |
JBoss Cache |
org.hibernate.cache.TreeCacheProvider |
集群 |
支持 |
支持 |
(3)二级缓存策略:
● 只读缓存(read-only)
如果应用程序需要读取一个持久化类的实例,但并不打算修改它们,可以使用read-only缓存。
对于从来不会修改的数据,如参考数据,可以使用这种并发访问策略。
● 读/写缓存(read-write)
如果应用程序需要更新数据,该缓存比较合适。如果需要序列化事务隔离级别,那么就不能使用这种缓存策略。
若在分布式应用中使用该策略,需要底层的缓存组件支持锁定机制。
● 不严格的读/写缓存(nonstrict-read-write)
如果程序读取频繁且极少更新数据(也就是说,出现两个事务同时更新同一个条目的现象很不常见),也不需要十分严格的事务隔离,适用该缓存。
对于极少被修改,并且允许偶尔脏读的数据,可以采用这种并发访问策略。
● 事务缓存(transactional)
transactional缓存策略提供了对全事务的缓存,仅仅用于JTA环境中。它提供了Repeatable Read事务隔离级别。
(4)管理二级缓存:
SessionFactory对象的evict(Class arg0)方法:
可以从二级缓存中清除指定的持久化类的所有缓存对象,并释放其占用的资源。
如:sessionFactory.evict(Category.class);
SessionFactory对象的evict(Class arg0,Serializable arg1)方法:
可以从二级缓存中清除某个持久化类的指定缓存对象。
如:sessionFactory.evict(Category.class,new Integer(1));
SessionFactory对象的evictCollection(String arg0)方法:
可以从二级缓存中清除指定的集合对象的缓存。
如:sessionFactory.evictCollection("com.hibernate.beans.products");
SessionFactory对象的evictCollection(String arg0,Serializable arg1)方法:
可以从二级缓存中清除集合对象中的指定对象。
如:sessionFactory.evictCollection("com.hibernate.beans.products",new Integer(1));
SessionFactory对象的evictEntity(String arg0)方法:
可以从二级缓存中清除指定的持久化类的所有缓存对象。
如:sessionFacotry.evictEntity("com.hibernate.beans.Category");
SessionFactory对象的evictEntity(String arg0,Serializable arg1)方法:
可以从二级缓存中清除某个持久化类的指定对象。
如:sessionFacotry.evictEntity("com.hibernate.beans.Category",new Integer(1));
5. 查询缓存
查询缓存使用map对象保存被缓存对象,(key值根据sql、查询参数、分页参数等构造)保证同样查询有同样key值;
hibernate会记录每个表的最后更新时间,并且查询缓存也有时间,hibernate会比较这两个时间判断缓存有效性。
6. 缓存对get(), load(), list(), iterator() 方法的影响
(1)get():先从一级缓存,后直接从数据库。缓存到一级缓存。
(2)load():先从一级缓存,再从二级缓存,最后从数据库。缓存到一二级缓存。
(3)Query的list():先检查是否配置查询缓存,在直接从数据库中;缓存到一二级,查询缓存中。
(4) Query的iterator():先从数据库查询所有符合条件的标识符属性值(id),再通过load()方法查询对应数据。
注:本文参考《Hibernate开发与实战》 刘伟 张利国 电子工业出版社 一书
转载于:https://blog.51cto.com/lindianli/1433809
hibernate之缓存相关推荐
- Hibernate一级缓存
2019独角兽企业重金招聘Python工程师标准>>> import java.io.Serializable; import org.hibernate.Session; impo ...
- Hibernate 所有缓存机制详解
hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...
- paip. 提升性能---hibernate的缓存使用 总结
paip. 提升性能---hibernate的缓存使用 总结 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog ...
- hibernate三级缓存概括
2019独角兽企业重金招聘Python工程师标准>>> Hibernate三级缓存 一级缓存(session级别缓存): 1.session关闭后,缓存就没了:hibernate发出 ...
- Hibernate二级缓存详解
与Session相对的是,SessionFactory也提供了相应的缓存机制.SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存. SessionFactory的内置 ...
- Hibernate二级缓存的使用
1启用Hibernate二级缓存 Hibernate二级缓存分为两部分,class缓存和查询缓存,其获取对象的方式有所不同,但两者也有联系,查询缓存必须以class缓存为基础才能起作用,否则只会使效率 ...
- hibernate mysql缓存机制_Hibernate的缓存机制
面试常问到的问题: 首先说下hibernate缓存的作用(即为什么要用缓存机制),然后再具体说说Hibernate中缓存分类情况,最后可以举例: Hibernate缓存的作用: Hibernate是一 ...
- Hibernate 二级缓存使用
1启用Hibernate二级缓存 Hibernate二级缓存分为两部分,class缓存和查询缓存,其获取对象的方式有所不同,但两者也有联系,查询缓存必须以class缓存为基础才能起作用,否则只会使效率 ...
- hibernate一级缓存和二级缓存的区别[转]
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...
- hibernate二级缓存理解
2019独角兽企业重金招聘Python工程师标准>>> 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对 ...
最新文章
- “中台不就是微服务吗?有啥区别?”
- 在linux下的使用复制命令cp,不让出现“overwrite”(文件覆盖)提示的方法。
- QWidget子窗口中setStyleSheet无效,解决方法
- CentOS下MySQL的彻底卸载
- Laravel 系列入门教程(一)【最适合中国人的 Laravel 教程】
- 树莓派:3安装NodeJS
- java中的udp丢包_UDP丢包问题
- noip2017初赛的一些知识点
- jclasslib查看字节码
- 日志,错误日志,成功日志,日志是个好东西。
- 数魔选品怎么样_Sellermotor数魔跨境好不好用?怎么样?
- phpstudy for linux版环境安装
- matlab/simulink中带参数的S-Function(S函数)的写法
- 解决origin8 licience 过期问题
- 统计学 | 峰度系数与肥尾理解
- python简易爬虫:xpath解析方式抓取几页小猪短租官网的住房信息
- CentOS部署单机Presto
- 5个流行的开源HIDS系统介绍
- Linux 上安装iib 9.0
- 游戏开发中的数学和物理算法10-18