hibernate 一级缓存:(缓存的是实体对象)
一级缓存很短和session的生命周期一致,一级缓存也叫session级的缓存或事务缓存
哪些方法支持一级缓存:
*get()
*load()
*iterate() (查询实体对象)
如何管理一级缓存:
* session.clear() session.evict()
如何避免一次性大量的实体数据入库导致内存溢出
*先flush,再clear
如果数据量特别大,考虑采用jdbc实现,如果jdbc也不能满足要求,可以考虑采用数据库本身的特定导入工具
一.Load测试: 在同一个session中发出两次load查询
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
在同一个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库, 第二次load的时候也不会,当使用的时候也不会查询数据库,因为他在缓存里找到,不会发出sql
Load测试: 开启两个session中发出两次load查询
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sessioin.close();
………..
sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
开启两个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库, 第二次load的时候也不会,当使用的时候查询数据库,因为session间不能共享一级缓存的数据,因为他会随session的生命周期存在和消亡
二.Get测试: 在同一个session中发出两次get查询
Student sutdent = (Student)session.get(Student.class,1);
System.out.println(student.getName());
sutdent = (Student)session.get(Student.class,1);
System.out.println(student.getName());
在同一个session中发出两次get查询, 第一次get的时候去查询数据库,第二次get的时候不会查询数据库,因为他在缓存里找到,不会发出sql
三.iterate测试: 在同一个session中发出两次iterator查询
Student student = (Student)session.createQuery(“from Student s where s.id=1”).iterate().next();
System.out.println(student.getName());
student = (Student)session.createQuery(“from Student s where s.id=1”).iterate().next();
System.out.println(student.getName());
在同一个session中发出两次iterator查询,第一次iterate().next()的时候会发出查询id的sql,使用的时候会发出相应的查询实体对象,第二次iterate().next()的时候会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存,不会发出sql
四.Iterate查询属性测试: 同一个session中发出两次查询属性
String name = (String)session.createQuery(“select s.name from Student s where s.id=1”).iterate().next();
System.out.println(name);
String name = (String)session.createQuery(“select s.name from Student s where s.id=1”).iterate().next();
System.out.println(name);
在同一个session中发出两次查询属性, 第一次iterate().next()的时候会发出查询属性的sql,第二次iterate().next()的时候会发出查询属性的sql,iterate查询普通属性,一级缓存不会缓存,所以会发出sql
五.同一个session中先save,再发出load查询save过的数据
Student stu = new Student();
stu.setName(“王五”);
Serializable id = session.save(stu);
Student sutdent = (Student)session.load(Student.class,id);
System.out.println(student.getName());
save的时候,他会在缓存里放一份,不会发出sql,因为save是使用缓存的
六.同一个session中先调用load查询,然后执行sessio.clear()或session.evict(),再调用load查询
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
session.clear();
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sessio.clear()或session.evict()可以管理一级缓存,一级缓存无法取消,但可以管理.
上面的语句都会发出sql 因为一级缓存中的实体被清除了
七.向数据库中批量加入1000条数据
for(int i=0;i<1000;i++){
Student student = new Student();
student.setName(“s” + i);
session.save(student);
//每20条数据就强制session将数据持久化,同时清除缓存,避免大量数据造成内存溢出
if( i %20 == 0 ){
session.flush();
session.clear();
}
}
相关推荐
此文章是对Mybatis框架的一级缓存一级二级缓存的描述,包括他们的作用,案例,以及部分源码分析,对一级缓存以及二级缓存进行了详细的描述以及概括,还有如何使用等内容
NULL 博文链接:https://quicker.iteye.com/blog/660498
学习hibernate的必备,提供一个简易的流程图,方便记忆和查找
Hibernate是一种面向Java环境的ORM工具。系统地分析了Hibernate的缓存结构,并描述了二级缓存的查询过程、缓存策略;同时总结了二级缓存使用中的一些限制,以及使用二级缓存的优化策略。
WEB缓存功能对于一个规模较大、访问繁忙的网络来说是有必要的,IBM网站上的一篇文章,详细分析介绍了WEB缓存给上网用户带来的好处: http://www-900.ibm.com/developerWorks/cn/web/webcachinga/index.shtml ...
中继系统可以利用网络编码技术在更少的...蒙特卡洛仿真证明了该模型的精准性,并证实该调度策略要优于已有的传输方法,该模型还可以被用来确定一个合理的缓存大小,在保证时延的情况下,通过增加缓存空间来提高吞吐量。
时间序列分析 一个时间序列通常由4种要素组成:趋势、季节变动、循环波动和不规则波动。 趋势:是时间序列在长时期内呈现出来的持续向上或持续向下的变动。 季节变动:是时间序列在一年内重复出现的周期性波动。它是...
CacheflowQL 是一个具有复杂缓存算法的 npm 包,可让开发人员深入了解其 GraphQL 查询和有关其缓存数据的指标,从而进行深入有效的运行时和查询分析。 cacheflowQL 适用于谁? CacheflowQL 适用于任何寻求轻量级...
Java语言的动态特性使程序的最坏执行时间分析较悲观和难以预测,提出一种精确最坏执行时间分析方法,在高层分析中,引入一种标记方法,对带有标记的Java类文件进行反编译提取控制流程,得到每一个基本块中的Java ...
在php页面缓存主要用到的是ob系列函数,如ob_start(),ob_end_flush(),ob_get_contents(),但是更高级的缓存是不使用这些函数的,本文最后会举一个实例加以说明. 先来看看缓存常用的ob系列函数: ob_start():页面缓存...
基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开发)问题总结 mybatis框架原理 (掌握) ... mybatis查询缓存(一级缓存、二级缓存) mybaits和spring进行整合(掌握) mybatis逆向工程
WEB缓存功能对于一个规模较大、访问繁忙的网络来说是有必要的,IBM网站上的一篇文章,详细分析介绍了WEB缓存给上网用户带来的好处:http://www-900.ibm.com/developer … achinga/index.shtml下面我们就介绍一下...
如果没有缓存的网站是百万级或者千万级的访问量,会给数据库或者服务器造成很大的压力,通过缓存,大幅减少服务器和数据库的负荷,假如我们把读取数据的过程分为三个层,第一个是访问层,第一个是缓存层,第三个是数据库...
提出了一种基于平行排列3×3耦合器的双环结构全光缓存器(DLOB)的级联方案,分析了单级和级联结构的缓存原理及读写方式,通过分析半导体光放大器(SOA)的噪声性能,得到光缓存器输出性能主要由读写操作阶段注入的控制光...
为提高动态可重构高速串行总线UM-BUS的带宽利用率,通过分析UM-BUS总线数据访问和传送的特点,提出了一种有效可行的两级缓存管理算法,并采用该算法设计了一种静态可重构的数据高速缓存机制。该缓存机制采用了驱动级...
首先提出了一种动态分级的网关代理的模型,分析了在这个模型下的缓存过程,研究了缓存区的分配与管理,并进行了仿真测试。理论和仿真分析表明,将缓存分为网关代理和局部代理两级,局部代理动态形成,使缓存任务得以...
并提供数据中心平台与安全管理方案,为企业级用户建立一个通用数据处理和分析 中心。如图1所示。 2.2 在线数据 在线数据在线通过接口去获得的数据,一般要求为秒级或速度更快。首先应当 将数据进行区分:在线数据、...
图片三级缓存 Bitmap的分析与使用 热修复的原理 AIDL Binder机制 Zygote和System进程的启动过程 Android中的MVC,MVP和MVVM MVP Android开机过程 Retrofit源码分析 Glide源码分析 EventBus用法详解 EventBus源码分析...
提出了“部分缓存共享”机制对应排队模型的一种修正模型:M/M/1/K(T),导出了该新模型的稳态概率分布,分析了共享缓存队列门限T和低优先级分组流业务强度对高优先级分组流丢失概率的影响.结果表明,相对于普通的M/M/...