Hibernate中的一级缓存、二级缓存和懒加载
1.为什么使用缓存
hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率。hibernate中有两种类型的缓存:一级缓存和二级缓存。
2.一级缓存
Hibenate中一级缓存,也叫做session的缓存,当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。
一级缓存可以在session范围内减少数据库的访问次数,只在session范围有效,session关闭,一级缓存失效。
session的缓存由hibernate维护, 用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。
特点:
只在当前session范围有效,作用时间短,效果不是特别明显!
在短时间内多次操作数据库,效果比较明显!
list和iterator的区别
list:
一次把所有的记录都查询出来
会放入缓存,但不会从缓存中获取数据
Iterator:
N+1查询; N表示所有的记录总数,即会先发送一条语句查询所有记录的主键(1),再根据每一个主键再去数据库查询(N)
会放入缓存,也会从缓存中取数据
public void test5()throws Exception{
Session session = sf.openSession();
session.beginTransaction(); User user = new User();
user.setUserName("林黛玉");
session.save(user);
user.setUserName("嘉宝");
session.save(user);
session.getTransaction().commit();
session.close();
}
由于一级缓存的作用,user对象只会被保存一次。
3.二级缓存
Hibernate提供了基于应用程序级别的缓存, 可以跨多个session,即不同的session都可以访问缓存数据。 这个缓存也叫二级缓存。
Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影响代码。如果用户觉得hibernate提供的框架框架不好用,自己可以换其他的缓存框架或自己实现缓存框架。
开启二级缓存:
list() 默认情况只会放入缓存,不会从一级缓存中取,配置查询缓存,可以让list()查询从二级缓存中取数据。
<!--开启二级缓存-->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!--指定使用的缓存框架-->
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property> <!--开启查询缓存-->
<property name="hibernate.cache.use_query_cache">true</property>
指定需要二级缓存的类:
如果设置了集合缓存,集合所属的元素对象也要放入二级缓存,即Employee。
<!--指定哪一些类需要加入二级缓存-->
<class-cache class="com.juaner.department.Employee" usage="read-only"/>
<class-cache class="com.juaner.department.Dept" usage="read-only"/>
<!--集合缓存,集合所属的类型也要放入二级缓存-->
<collection-cache collection="com.juaner.department.Dept.emps" usage="read-only"/>
使用二级缓存:
如果设置了查询缓存,需要手动设置setCacheable(true)。
@Test
public void test1(){
Session session = sf.openSession();
session.beginTransaction();
//setCacheable 指定从二级缓存中找,或放入二级缓存,针对list不从一级缓存中取数据的情况
//从缓存中读数据,查询条件必须一致
//缓存机制为Map<条件,结果>
Query query = session.createQuery("from Dept").setCacheable(true);
System.out.println(query.list()); session.getTransaction().commit();
session.close(); Session session1 = sf.openSession();
session1.beginTransaction(); query = session1.createQuery("from Dept").setCacheable(true);
System.out.println(query.list()); session1.getTransaction().commit();
session1.close();
}
4.get和load
get: 及时加载,只要调用get方法立刻向数据库查询
load:默认使用懒加载,当用到数据的时候才向数据库查询
5.懒加载
当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性。
lazy 值
true 使用懒加载
false 关闭懒加载
extra 在集合数据懒加载时候提升效率,在真正使用数据的时候才向数据库发送查询的sql,如果调用集合的size()/isEmpty()方法,只是统计,不真正查询数据!
Hibernate中的一级缓存、二级缓存和懒加载的更多相关文章
- hibernate之xml映射文件关系维护,懒加载,级联
一:关系维护 --->inverse默认值false,表示不放弃关系的维护. --->inverse="true"配置在那一端,表示那一端xml对应的po放弃关系的 ...
- dubbo序列化hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决
dubbo序列化,hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决 转载声明: ...
- webpack学习笔记—优化缓存、合并、懒加载等
除了前面的webpack基本配置,还可以进一步添加配置,优化合并文件,加快编译速度.下面是生产环境配置文件webpack.production.js,与wenbpack.config.js相比其不需要 ...
- OC中重写set和get方法、懒加载
在写OC程序的时候,在很多时候我们会用到重写set或者get方法,重写这两个方法大多是用于刷新数据,比如懒加载. 意思就是说当你去调用set或者get方法时,系统会去调用重写的get或者set方法,这 ...
- hibernate懒加载(转载)
http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下 ...
- Hibernate懒加载深入分析
Hibernate懒加载深入分析 懒加载可以提高性能吗? 不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越. ...
- iOS开发UI中懒加载的使用方法
1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...
- Hibernate 性能优化之懒加载
针对数据库中的大数据,不希望特别早的加载到内存中,当用到它的时候才加载 懒加载分为:类的懒加载.集合的懒加载.单端关联的懒加载 类的懒加载 1.在默认情况下,类就是执行懒加载 2. ...
- 在webpack中使用Code Splitting--代码分割来实现vue中的懒加载
当Vue应用程序越来越大,使用Webpack的代码分割来懒加载组件,路由或者Vuex模块, 只有在需要时候才加载代码. 我们可以在Vue应用程序中在三个不同层级应用懒加载和代码分割: 组件,也称为异步 ...
- Swift中懒加载(lazy initialization)的实现
Swift中是存在和OC一样的懒加载机制的,但是这方面国内的资料比较少,今天把搜索引擎换成了Bing后发现用Bing查英文\最新资料要比百度强上不少. 我们在OC中一般是这样实现懒加载初始化的: 1: ...
随机推荐
- POJ 3468(树状数组的威力)
之前说过这是线段树的裸题,但是当看了http://kenby.iteye.com/blog/962159 这篇题解后我简直震惊了,竟然能如此巧妙地转化为用树状数组来处理,附上部分截图(最好还是进入原网 ...
- spring中的Log4jConfigListener作用和webapp.root的设置
转:http://blog.sina.com.cn/s/blog_7bbf356c01016wld.html 使用spring中的Log4jConfigListener有如如下好处: 1. 动 ...
- 转:如何学习SQL(第二部分:从关系角度理解SQL)
转自:http://blog.163.com/mig3719@126/blog/static/285720652010950825538/ 6. 从关系角度理解SQL 6.1. 关系和表 众所周知,我 ...
- iOS高性能图片架构与设计
版权声明:本文由柯灵杰原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/157 来源:腾云阁 https://www.qclo ...
- ARPG游戏技能系统设计
ARPG游戏的技能的前端表现, 主要指的是人物动作和特效表现, 从普遍意义上讲,大致可以分为三个阶段:起手.飞行.碰撞(爆炸). [特效可见性判断] 1.[attacker & victim] ...
- jquery函数
1.ready函数 当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件. $(document).ready(function (){alert('11 ...
- hdu 1710 二叉树的遍历
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1710 大意:给出一个二叉树的前序和中序,求其后序遍历 ps:1.在写链表时,需要写明typedef str ...
- spring来了-03-bean创建细节
对象创建:单例/多例 [bean节点的属性scope] scope="singleton", 默认值,即默认是单例 [service/dao/工具类] scope=&qu ...
- 《Java程序设计》第二周学习总结
20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...
- nodeschool.io 7
~~ HTTP CLIENT ~~ Write a program that performs an HTTP GET request to a URL provided toyou as the f ...