`
java_beginner_liyun
  • 浏览: 74513 次
  • 性别: 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();

}

}

 

分享到:
评论

相关推荐

    Hibernat一级缓存(源码)

    在 Hibernate 中,一级缓存是默认开启的一种缓存机制,对于提高应用程序性能有着重要作用。一级缓存位于 Session 对象中,是每个 Session 的私有缓存,它存储了从数据库中读取的对象实例。 一级缓存的工作原理: 1....

    hibernate一级缓存

    对于开发和调试,有一些工具如Hibernate Profiler可以帮助我们可视化一级缓存的使用情况,分析性能瓶颈,从而更好地优化应用。 综上所述,Hibernate的一级缓存是提升应用性能的关键要素。通过理解其工作机制并结合...

    一级缓存和二级缓存

    一级缓存(L1 Cache)和二级缓存(L2 Cache)是CPU内部的重要组成部分,它们位于主内存和CPU核心之间,扮演着数据快速访问的角色。本文将深入探讨这两个级别的缓存系统,以及它们在优化计算性能中的作用。 首先,一...

    Hibernate性能优化:一级缓存

    本文将深入探讨Hibernate性能优化中的一个重要概念——一级缓存,并结合给出的压缩包文件“hibernate_cache_level1”,来详细解析一级缓存的工作原理及其优化策略。 一级缓存是Hibernate内置的一种缓存机制,它存在...

    图片二级缓存

    "图片二级缓存"是一种优化策略,旨在加快图片的加载速度,减少网络请求,提高应用程序性能。本文将深入探讨这个主题,并结合提供的"图片二级缓存demo"进行详细解释。 一、图片缓存的概念 图片缓存是将从服务器下载...

    MyBatis3开启二级缓存

    然而,一级缓存存在生命周期问题,当SqlSession关闭时,一级缓存就会被清空。二级缓存则解决了这个问题,它是Mapper级别的,可以跨SqlSession共享数据,增强了缓存的持久性。 **二、开启二级缓存** 1. **配置...

    深入理解Hibernate缓存

    在Hibernate中,缓存分为一级缓存(第一级缓存)和二级缓存(第二级缓存)。一级缓存是默认启用的,它存储在一个`Session`实例中,用于减少数据库交互次数。二级缓存则可以跨多个`Session`实例共享,主要用于提高...

    hibernate二级缓存示例源码

    Hibernate的一级缓存是Session级别的,它自动管理对象的状态,提供瞬时、持久化和脱管状态之间的转换。然而,一级缓存的范围有限,当Session关闭时,其中的数据会被清除。为了解决这个问题,Hibernate引入了二级缓存...

    Hibernate4二级缓存实例(源码)

    1. **Hibernate二级缓存**:二级缓存是Hibernate在一级缓存(Session级别的缓存)之外提供的全局共享缓存,可以跨Session共享数据。它允许多个并发用户访问相同的数据,减少对数据库的访问次数,提高系统性能。 2. ...

    基于redis的二级缓存

    在传统的Web应用中,一级缓存通常是应用程序内部的缓存,如Java中的EHCache或Guava Cache,而二级缓存则是使用外部服务,如Redis,存储那些不能立即在一级缓存中找到的数据。Redis因其快速、灵活且支持多种数据结构...

    Mybatis缓存测试示例

    一级缓存是SqlSession级别的,同一SqlSession内的多次相同查询会复用之前的查询结果,避免了重复的数据库访问。而二级缓存则是Mapper(或Namespace)级别的,它可以跨SqlSession共享数据,提高了数据读取效率。 一...

    Mybatis的以及缓存和二级缓存(案例).mhtml

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

    hibernate二级缓存

    `Hibernate二级缓存攻略.doc`可能是整个工程的指南,包括如何导入工程,运行测试用例,以及对一级缓存和二级缓存的观察分析。 项目中的`hb1101`可能是一个特定的配置文件或代码模块,用于演示如何在实际应用中设置...

    三级缓存demo

    这个“三级缓存demo”项目为我们提供了一个实践和学习这两个缓存机制的实例,可以帮助我们更好地理解和应用这些技术。通过分析项目的源代码,我们可以深入探究如何在实际项目中有效地整合和管理内存及磁盘缓存,提高...

    hibernate二级缓存(包括注解方式)

    1. **Hibernate二级缓存**:在默认情况下,Hibernate只使用一级缓存(Session级别的缓存),二级缓存则可由用户自定义配置。二级缓存是多个Session共享的,可以跨事务存储对象,提高了数据读取速度,减少了对数据库...

    RecyclerView的四级缓存源码分析

    这是RecyclerView的第一级缓存,主要用于存储View的布局参数(LayoutParams)。当一个ViewHolder被回收时,它的LayoutParams会被保存在LruCache中。当创建新ViewHolder时,如果能够从LruCache中找到匹配的...

    android安卓图片的三级缓存DEMO 三层缓存示例下载 强引用 软引用

    "android安卓图片的三级缓存DEMO 三层缓存示例下载 强引用 软引用"这个资源提供了对图片加载优化的一个常见实践——三级缓存机制的实现。下面将详细讲解这一知识点。 首先,我们来理解什么是图片的三级缓存。在...

    Hibernate二级缓存.doc

    Hibernate提供了两种缓存机制:一级缓存和二级缓存。一级缓存是默认开启的,主要用于事务间的缓存管理;而二级缓存则更侧重于应用间的缓存共享,旨在提高数据读取效率,减少不必要的数据库交互。 #### 二、一级缓存...

    合理利用“二级缓存”技术 提高数据库整体性能

    Infinite Cache的工作原理是,当数据被请求时,如果不在一级缓存(数据库内存)中,就会从二级缓存中查找。如果二级缓存中也没有,再从硬盘读取,然后将数据加载到二级缓存,以便后续请求能快速获取。数据更新时,...

    day37 03-Hibernate二级缓存:集合缓冲区特点

    一级缓存是每个Hibernate Session内部的缓存,它存储了当前Session中的持久化对象。而二级缓存则是应用级的,可以在多个Session之间共享,进一步提高了性能。对于集合类的数据,如List、Set等,Hibernate提供了特殊...

Global site tag (gtag.js) - Google Analytics