Session 的缓存(一级缓存):
我们知道在 JVM 中,如果一个对象被还被其它域引用,那么这个对象的生命周期就不会结束,Java的
垃圾清理器就不会清理该对象所占用的内容空间。
在Hibernate中,Session维护了很多集合,其中就会把当前持久化的对象保存在一个集合中。
Person p = new Person("Jenney", 20);
session.save(p); // 持久化操作:Session将会把这个 Person 对象存入集合中。
id = p.getId();
当我们下次再操作该对象时,我们就可以从内存中把它拿出来,这样就减少了与数据库打交道的机会,从而
提高了性能。
Person p = session.load(Person.class, id); // 从Session的缓存中加载该对象
那么,什么时候这个集合会被清空呢?当我们调用 Session.commit(); 方法的时候,Session的缓存将被
清空。
Session的缓存有两大作用:
(1):减少数据库访问的频率
(2):保证缓存中的对象与数据库记录保持同步,位于缓存中的对象始终与数据库记录保持一致,
所以该对象称为持久化对象。
当缓存中对象的属性发生了改变,Session不会立即同步到数据库(立即执行SQL语句),
这使得Session能够把几条相关的SQL语句合并为一条。以便减少对数据库的访问,提高应用程序性能。
例如:
Person p = new Person();
p.setName("a");
p.setName("b");
session.commit();
当Session在清理缓存时,只生成了一条SQL语句 :update Person set name='b' where id = ?
当Session加载了对象时,Session会为该对象值类型的属性设置一份快照,当清理缓存时,就会去比较
快照中的对象与当前对象哪些值类型的属性发生了改变,并生成SQL语句。
那么 Session 到底是在什么情况下才会清理内存,生成SQL语句呢?
默认情况下,Session会在以下时间点清理缓存:
(1):当调用session.commit()方法时,Session会先 清理缓存 ,然后 commit 事物。
(2):当调用 session.find() / session.iterate() 方法时,Session会先清理缓存,以保证查询出来
的持久化对象是最新的状态。
(3):当调用 session.flush() 方法的时候,该方法就是清理缓存的方法。
注意:flush 方法是清理缓存的方法,但它不会提交事物。而commit方法会先调用flush方法清理缓存,然后
才会提交数据库事物。
当然,我们也可以手动设置Session的清理缓存的模式。session.setFlushMode(FlushMode);方法用于设置
Session的清理缓存模式。 Session 清理缓存的模式有三种
FlushMode.AUTO 默认方式,会在每次执行查询操作前清理缓存。
FlushMode.COMMIT 在提交事物时 先清理缓存再提交事物
FlushMode.NEVER 只在 显示调用 session.flush(); 方法时清理缓存。
如果,一个事物中仅仅只有查询数据库的操作而没有修改数据库数据的操作,我们就可以使用 COMMIT 模式,
这样可以避免Session在查询数据库的时候清理缓存,可以稍微提高应用程序的性能。
在多数情况下,我们不需要显示的调用 flush 方法。flush方法适用于以下场合:
(1)在持久化某个对象时会引发数据库中的触发器,这时我们显示的调用 flush 方法就可以及时的更新
到数据库并引发触发器执行相关联的操作。
(2)在应用程序中混合使用 Hibernate 和 JDBC 时,需要及时清理缓存以避免和 JDBC 操作发生冲突。
分享到:
相关推荐
- **生命周期与Session一致**:一级缓存的生命周期跟随Session,当Session关闭时,一级缓存中的所有对象将会被清除。 - **自动管理**:Hibernate会自动管理一级缓存,无需开发者额外配置。 - **线程安全**:由于每个...
《深入理解Hibernate的一级缓存与二级缓存》 Hibernate作为一款强大的ORM框架,其缓存机制是优化数据库操作性能的关键之一。缓存主要分为一级缓存和二级缓存,它们各自承担着不同的职责,共同提升了数据访问的效率...
通过运行测试,我们可以观察到不同缓存机制如何工作,比如一级缓存如何避免重复的数据库访问,二级缓存如何在多个Session间共享数据,以及查询缓存如何提高重复查询的性能。 总的来说,理解和合理使用Hibernate的...
一级缓存(First Level Cache)是SessionFactory创建的Session内的缓存,它是默认开启且不可关闭的。每次当我们通过Session对象进行CRUD(创建、读取、更新、删除)操作时,Hibernate都会在一级缓存中处理这些对象。...
标题“Hibernate一级缓存和二级缓存”指的是Hibernate框架中的两种缓存机制,它们是提高数据访问性能的关键要素。一级缓存是Session级别的,而二级缓存是SessionFactory级别的,两者在数据库操作中起到了重要的作用...
一级缓存是 Session 级别的缓存,也称为本地缓存(Local Cache)。每当我们在一个 SqlSession 中执行了 CRUD 操作,查询的结果会被存储在当前 SqlSession 的一级缓存中。如果下次再请求同样的 SQL,MyBatis 会首先在...
总结来说,Hibernate的缓存机制包括一级缓存和二级缓存,它们协同工作以优化数据库操作。一级缓存是必不可少的,提供事务级别的数据管理;二级缓存则是可选的,用于进一步提升性能,但需要根据数据的特性和访问模式...
在 Hibernate 中,一级缓存是默认开启的一种缓存机制,对于提高应用程序性能有着重要作用。一级缓存位于 Session 对象中,是每个 Session 的私有缓存,它存储了从数据库中读取的对象实例。 一级缓存的工作原理: 1....
一级缓存是Hibernate默认提供的缓存,它是Session级别的,每个Hibernate Session都有一个私有的、本地的一级缓存。当我们在Session中对对象进行 CRUD(创建、读取、更新、删除)操作时,这些对象会被自动放入一级...
一级缓存,也称为session缓存,是每个Hibernate Session内部管理的一个内存结构。在本篇文章中,我们将深入探讨一级缓存的工作原理、作用以及如何有效地利用它。 ### 一级缓存的工作机制 1. **对象持久化过程**:...
一级缓存,也称为Session缓存,是Hibernate内置的默认缓存。每当我们在Session中进行持久化操作时,对象都会被放入一级缓存。一级缓存具有以下特点: 1. 持久性:在Session的生命周期内,一级缓存中的对象始终保持...
一级缓存,也称为Session缓存,存在于单个Session实例中。其目的是减少对数据库的访问次数,提高程序效率。一级缓存仅在Session生命周期内有效,随着Session关闭而失效。当执行诸如save、saveOrUpdate、get、load、...
当我们在Session中进行CRUD操作时,对象会自动被放入一级缓存。一级缓存是事务隔离的,也就是说,同一个SessionFactory下的不同事务无法看到彼此的一级缓存中的数据,这确保了数据一致性。然而,一级缓存空间有限,...
**描述:**这篇博客主要探讨了Hibernate框架中的缓存机制,包括一级缓存和二级缓存的概念、工作原理以及如何在实际开发中应用。 **标签:“源码 工具”** **知识点详解:** **1. Hibernate概述:** Hibernate是一...
1. **一级缓存(Session缓存)**:是Hibernate的默认缓存,每个Session对象都有自己的缓存。一级缓存是事务性的,与Session的生命周期绑定,同一事务内的数据操作都在一级缓存中进行,一旦事务结束,未提交的变更将...
一级缓存是Hibernate内置的一种缓存机制,它存在于SessionFactory的生命周期内,是线程安全的。每次Session打开时,都会共享同一个SessionFactory的一级缓存,因此,对于同一会话内的多次查询,如果对象已在一级缓存...
- **概念**:一级缓存由 Session 对象提供,仅在其生命周期内有效。当 Session 关闭时,其关联的一级缓存也被清除。 - **实现**:一级缓存采用 Map 结构实现,其中实体对象的主键作为键(key),实体对象本身作为值...
本文将深入探讨 Hibernate 的缓存机制,包括其两个级别——一级缓存和二级缓存,并讨论它们的工作原理、范围、并发访问策略以及如何管理和配置。 1. **一级缓存** - **范围与作用**:一级缓存是 Session 级别的...