`
java_beginner_liyun
  • 浏览: 73372 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一级缓存分析

阅读更多

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的以及缓存和二级缓存(案例).mhtml

    此文章是对Mybatis框架的一级缓存一级二级缓存的描述,包括他们的作用,案例,以及部分源码分析,对一级缓存以及二级缓存进行了详细的描述以及概括,还有如何使用等内容

    Hibernate性能优化:一级缓存

    NULL 博文链接:https://quicker.iteye.com/blog/660498

    Hibernate二级缓存配置与分析

    学习hibernate的必备,提供一个简易的流程图,方便记忆和查找

    Hibernate缓存技术研究

    Hibernate是一种面向Java环境的ORM工具。系统地分析了Hibernate的缓存结构,并描述了二级缓存的查询过程、缓存策略;同时总结了二级缓存使用中的一些限制,以及使用二级缓存的优化策略。

    缓存代理服务器Squid-教程

    WEB缓存功能对于一个规模较大、访问繁忙的网络来说是有必要的,IBM网站上的一篇文章,详细分析介绍了WEB缓存给上网用户带来的好处: http://www-900.ibm.com/developerWorks/cn/web/webcachinga/index.shtml ...

    有限缓存双向中继系统性能分析

    中继系统可以利用网络编码技术在更少的...蒙特卡洛仿真证明了该模型的精准性,并证实该调度策略要优于已有的传输方法,该模型还可以被用来确定一个合理的缓存大小,在保证时延的情况下,通过增加缓存空间来提高吞吐量。

    基于spring boot上的注解缓存,自带轻量级缓存管理页面.zip

    时间序列分析 一个时间序列通常由4种要素组成:趋势、季节变动、循环波动和不规则波动。 趋势:是时间序列在长时期内呈现出来的持续向上或持续向下的变动。 季节变动:是时间序列在一年内重复出现的周期性波动。它是...

    cacheflow:一种在 graphQL 服务器上缓存的轻量级方法

    CacheflowQL 是一个具有复杂缓存算法的 npm 包,可让开发人员深入了解其 GraphQL 查询和有关其缓存数据的指标,从而进行深入有效的运行时和查询分析。 cacheflowQL 适用于谁? CacheflowQL 适用于任何寻求轻量级...

    论文研究-一种精确程序最坏执行时间分析方法.pdf

    Java语言的动态特性使程序的最坏执行时间分析较悲观和难以预测,提出一种精确最坏执行时间分析方法,在高层分析中,引入一种标记方法,对带有标记的Java类文件进行反编译提取控制流程,得到每一个基本块中的Java ...

    php页面缓存方法小结

    在php页面缓存主要用到的是ob系列函数,如ob_start(),ob_end_flush(),ob_get_contents(),但是更高级的缓存是不使用这些函数的,本文最后会举一个实例加以说明. 先来看看缓存常用的ob系列函数: ob_start():页面缓存...

    MyBatis入门以及提高

    基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开发)问题总结 mybatis框架原理 (掌握) ... mybatis查询缓存(一级缓存、二级缓存) mybaits和spring进行整合(掌握) mybatis逆向工程

    搭建一个大型网站架构的实验环境(Squid缓存服务器篇)第1/2页

    WEB缓存功能对于一个规模较大、访问繁忙的网络来说是有必要的,IBM网站上的一篇文章,详细分析介绍了WEB缓存给上网用户带来的好处:http://www-900.ibm.com/developer … achinga/index.shtml下面我们就介绍一下...

    thinkphp缓存技术详解

    如果没有缓存的网站是百万级或者千万级的访问量,会给数据库或者服务器造成很大的压力,通过缓存,大幅减少服务器和数据库的负荷,假如我们把读取数据的过程分为三个层,第一个是访问层,第一个是缓存层,第三个是数据库...

    双环结构级联型全光缓存器

    提出了一种基于平行排列3×3耦合器的双环结构全光缓存器(DLOB)的级联方案,分析了单级和级联结构的缓存原理及读写方式,通过分析半导体光放大器(SOA)的噪声性能,得到光缓存器输出性能主要由读写操作阶段注入的控制光...

    基于UM-BUS总线的可重构缓存机制的研究与设计

    为提高动态可重构高速串行总线UM-BUS的带宽利用率,通过分析UM-BUS总线数据访问和传送的特点,提出了一种有效可行的两级缓存管理算法,并采用该算法设计了一种静态可重构的数据高速缓存机制。该缓存机制采用了驱动级...

    一种基于动态分级网关代理的移动IP缓存方案 (2006年)

    首先提出了一种动态分级的网关代理的模型,分析了在这个模型下的缓存过程,研究了缓存区的分配与管理,并进行了仿真测试。理论和仿真分析表明,将缓存分为网关代理和局部代理两级,局部代理动态形成,使缓存任务得以...

    一种大数据智能分析平台的数据分析方法及实现技术.doc

    并提供数据中心平台与安全管理方案,为企业级用户建立一个通用数据处理和分析 中心。如图1所示。 2.2 在线数据 在线数据在线通过接口去获得的数据,一般要求为秒级或速度更快。首先应当 将数据进行区分:在线数据、...

    最全java面试题.zip

    图片三级缓存 Bitmap的分析与使用 热修复的原理 AIDL Binder机制 Zygote和System进程的启动过程 Android中的MVC,MVP和MVVM MVP Android开机过程 Retrofit源码分析 Glide源码分析 EventBus用法详解 EventBus源码分析...

    “部分缓存共享”机制的分组丢失率分析* (2000年)

    提出了“部分缓存共享”机制对应排队模型的一种修正模型:M/M/1/K(T),导出了该新模型的稳态概率分布,分析了共享缓存队列门限T和低优先级分组流业务强度对高优先级分组流丢失概率的影响.结果表明,相对于普通的M/M/...

Global site tag (gtag.js) - Google Analytics