博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hiberbnate 缓存策略概述
阅读量:4627 次
发布时间:2019-06-09

本文共 2125 字,大约阅读时间需要 7 分钟。

1. 首先了解什么是缓存

这里说的缓存并不是指计算机的内存或者CPU的一二级缓存。缓存是指为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能的一种策略。即对物理数据源的复制,存在于内存中。
为什么使用缓存:1.ORM框架访问数据库的效率直接影响应用程序的运行速度,提升和优化ORM框架的执行效率至关重要。2.Hibernate的缓存是提升和优化Hibernate执行效率的重要手段,所以学会Hibernate缓存的使用和配置是优化的关键。3.评判一个ORM框架是否优秀,访问数据库的频次就是一个重要的标准。

Hibernate缓存:1.Hibernate缓存与session相关,同一个session第二次访问同一个对象将使用缓存。2.在不同的session中多次查询同一个对象时,会执行多次数据库查询。3.在一级缓存当中,持久化类的每个实例都具有唯一的OID,也就是说同一个session两次查询同一个对象时,第二次是不会再将对象保存在缓存当中的。 2. 由下列代码可知使用缓存和不使用缓存的一些区别: 即:

 

3. hibernate一级缓存介绍

3.1 一级缓存session 的相关API  【一级缓存无法取消,用两个方法管理——evict() & clear() 】(执行两者之后都将在控制台重新输出查询语句)

Employee emp=(Employee) session.get(Employee.class,1);                System.out.println(emp.getName());                    //          创建另一新的缓存    //            session =sessionFactory.openSession();                                session.evict(emp);//将该对象从一级缓存中清除//                session.clear();//清除一级缓存中的所有内容                emp=(Employee) session.get(Employee.class,1);                System.out.println(emp.getName());

3.2 关于遍历操作的两个方法之间的区别【 list() & iterate() 】 

3.2.1 list()遍历查询

结论:  query.list() 不会使用到缓存

 3.2.2 iterate()遍历查询

Query query =session.createQuery("from Employee");//                List
list =query.list();// for(Employee emp:list){// System.out.println(emp.getName());// } Iterator it =query.iterate(); while(it.hasNext()){ Employee emp=(Employee)it.next(); System.out.println(emp.getName()); }

取消注释时,由于list()查询后session中已有数据,这时iterate()方法会从缓存中获取所需数据

 

执行注释时,iterate()方法依然会先从缓存中查找,因为缓存中没有所需的数据,这时会再从数据库中查找

 

3.2.3 小结一级缓存:

只能在一次会话中或者只在本次session 中起作用,这是hibernate 自带的不可消除,query 创建的查询create query (from 对象)表示查询所有的信息,query.list 不能从session 中获取缓存但可以存缓存。迭代器查询所有,先查询所有对象中的id 然后通过id 在session 缓存中查取id 所对应的所有信息,有几个id向数据库发送几次操作或者说是执行几次查询语句。

 

4. 二级缓存(解决一个session在其他session中能直接使用问题

 

 

<cache/>标签( .hbm.xml文件)

标签介绍:

5. 一二级缓存对比

 

总结:

1)hibernate的缓存能提高检索效率2)hibernate的缓存分为一级缓存和二级缓存。一级缓存是会话级缓存,二级缓存是应用级缓存。3)hibernate的缓存在提高检索的同时,也会增加服务器的消耗,所以注意缓存的使用策略。

 

 

转载于:https://www.cnblogs.com/zjfjava/p/6738255.html

你可能感兴趣的文章
java.lang.IllegalArgumentException: Request header is too large
查看>>
如何解决安卓SDK无法下载Package的问题
查看>>
我的知识组织管理
查看>>
gradle spring boot构建项目
查看>>
MTK 修改默认屏幕亮度
查看>>
进程间的几种通信方式
查看>>
IO流--File--properties
查看>>
java中的四种权限
查看>>
二维前缀和
查看>>
HttpServletResponse对象(二)
查看>>
Perl删除数组中元素的多种方法
查看>>
应用程序逻辑与业务逻辑区分
查看>>
HTML中margin与padding的区别!(转)
查看>>
c# 快捷键
查看>>
ffmepg命令行参数
查看>>
反向代理与负载均衡
查看>>
Js_DOM简单案例
查看>>
c#继承 里氏转化原则
查看>>
宁波宁海智能汽车小镇电脑设置流程
查看>>
taro编译的时候报 exports.pRimraf = util_1.promisify(rimraf); 错误
查看>>