`

Hibernate part 7:Session 一级缓存

 
阅读更多

 

在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期

 

一级缓存是存在的,通过get()查询Customer对象,查询两次ID为1的Customer对象,控制台只发送了一条SQL,并且打印c1和c2,获得的地址是一样的,可以证明Session缓存是存在的

	@Test
	public void testSessionExist() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Customer c1 = (Customer) session.get(Customer.class, 1);
		System.out.println(c1);
		
		Customer c2 = (Customer) session.get(Customer.class, 1);// 再次执行查询,直接使用一级缓存中数据
		System.out.println(c2);
		
		transaction.commit();
		session.close();
	}

 

Session缓存和快照的存储原理

	@Test
	public void testSession02() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Customer c = (Customer) session.get(Customer.class, 1); //persistent状态对象
		c.setName("孙艺珍");	//修改一级缓存中的数据
		//session.save(c); //不调用save()方法
		
		transaction.commit();
		session.close();
	}

 在没有调用save()情况下,程序依然更新了ID为1的Customer对象

 
  代码层面关闭事物,在hibernte.cfg.xml中配置hibernate.connection.autocommit事物自动提交,但数据然仍没有被修改,只有flush()后才会去比较一级缓存和快照区数据是否一致,commit()中已经调用flush()了

 

	@Test
	public void testSession02() {
		Session session = HibernateUtils.openSession();
		
		Customer c = (Customer) session.get(Customer.class, 1); //persistent状态对象
		c.setName("孙艺珍");	//修改一级缓存中的数据
                session.flush();
		//session.save(c); //不调用save()方法
		
		session.close();
	}
 

 

默认情况下 Session 在以下时间点刷出缓存:

  • 当应用程序调用 Transaction 的 commit()方法的时, 该方法先刷出缓存(session.flush()),然后在向数据库提交事务(tx.commit())
  • 当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,会先刷出缓存,以保证查询结果能够反映持久化对象的最新状态
  • 调用 Session 的 flush() 方法
一级缓存常见操作:
  • flush 比较缓存数据和 快照数据是否一致,如果改变 ,将缓存数据更新到数据库,快照更新, 不会清除缓存数据
  • clear 清除所有一级缓存数据,所有持久对象都会变为脱管对象
  • evict 清除指定对象的一级缓存数据,被清除的对象,由持久变为脱管
  •  refresh  使用数据库中数据去覆盖缓存和快照的数据
一级缓存的FlushMode:


 ALWAYS和AUTO的区别:当hibernate缓存中的对象被改动之后,会被标记为脏数据(即与数据库不同步了)。当 session设置为FlushMode.AUTO时,hibernate在进行查询的时候会判断缓存中的数据是否为脏数据,是则刷数据库,不是则不刷, 而always是直接刷新,不进行任何判断。很显然auto比always要高效得多

 

 

  • 大小: 32.9 KB
  • 大小: 58.8 KB
分享到:
评论

相关推荐

    Hibernate Part 3:核心API和常量配置

    7. **Constants Configuration**:常量配置可能包括缓存级别、二级缓存配置、实体的默认状态(如是否自动提交)等,这些配置可以显著影响性能。 8. **Entity Mapping**:介绍了如何通过XML或注解将Java类映射到...

    孙卫琴精通hibernate part3

    3. **缓存策略**: Hibernate支持一级缓存(Session级别)和二级缓存(SessionFactory级别)。理解何时使用一级缓存和二级缓存,以及它们的工作原理,对于提升应用程序性能至关重要。 4. **关联映射**: Hibernate...

    孙卫琴精通hibernate part1

    《孙卫琴精通Hibernate Part1》是一份关于深入学习Hibernate框架的教程,涵盖了该框架的基础与进阶内容。本部分是整个系列的前三章节,旨在帮助开发者全面理解Hibernate的工作原理和核心特性,以便在实际开发中高效...

    精通hibernate(part 2)共分4个part (孙卫琴)

    Hibernate的缓存分为一级缓存和二级缓存两部分: - **一级缓存**:也称为Session级别的缓存,是默认开启的。当Session关闭后,该缓存中的数据就会被清除。 - **二级缓存**:也称为SessionFactory级别的缓存,它不是...

    Hibernate程序高手秘笈.part01-03.rar

    8. Cache机制:解释Hibernate的缓存策略,包括第一级缓存和第二级缓存,以及如何配置和优化缓存以提高系统性能。 9. 性能优化:讨论如何通过合理的设计和配置提升Hibernate应用的性能,包括延迟加载、批处理和连接...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     22.3 管理Hibernate的第一级缓存  22.4 管理Hibernate的第二级缓存  22.4.1 配置进程范围内的第二级缓存  22.4.2 配置集群范围内的第二级缓存  22.4.3 在应用程序中管理第二级缓存  22.4.4 Session与第二级...

    Hibernate程序高手秘笈.part04-06.rar

    8. **缓存机制**:Hibernate的缓存策略,包括一级缓存(Session级别的)和二级缓存(SessionFactory级别的),以及第三方缓存集成,如 EhCache。 9. **事务管理**:介绍Hibernate的事务处理,包括编程式和声明式...

    精通hibernate(part 4)共分4个part (孙卫琴)

    6. **Cache**:缓存机制用于提高应用程序性能,Hibernate支持一级缓存和二级缓存。 7. **Entity Manager**:Java Persistence API (JPA)引入的概念,为开发者提供了一组统一的接口,用于管理实体对象的生命周期。 ...

    Hibernate程序高手秘笈.part07-09.rar

    5. **缓存机制**:讨论了Hibernate的缓存层次结构,包括一级缓存(Session缓存)和二级缓存(SessionFactory缓存),以及第三方缓存实现,如Ehcache和Infinispan。 6. **事务管理**:讲解了Hibernate的事务处理,...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    精通hibernate(part 1)共分4个part (孙卫琴)

    - **缓存机制**:介绍Hibernate的一级缓存和二级缓存,以及如何利用它们优化性能。 - **懒加载与立即加载**:解释这两种加载策略的区别及其应用场景。 - **多对多关联**:介绍如何在Hibernate中实现多对多关联,...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     22.3 管理Hibernate的第一级缓存  22.4 管理Hibernate的第二级缓存  22.4.1 配置进程范围内的第二级缓存  22.4.2 配置集群范围内的第二级缓存  22.4.3 在应用程序中管理第二级缓存  22.4.4 Session与第二级...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     22.3 管理Hibernate的第一级缓存  22.4 管理Hibernate的第二级缓存  22.4.1 配置进程范围内的第二级缓存  22.4.2 配置集群范围内的第二级缓存  22.4.3 在应用程序中管理第二级缓存  22.4.4 Session与第二级...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     22.3 管理Hibernate的第一级缓存  22.4 管理Hibernate的第二级缓存  22.4.1 配置进程范围内的第二级缓存  22.4.2 配置集群范围内的第二级缓存  22.4.3 在应用程序中管理第二级缓存  22.4.4 Session与第二级...

    hibernate-distribution-3.3.1.part4

    标题“hibernate-distribution-3.3.1.part4”和描述中提到的关键词“hibernate-distribution-3.3.1.part4”暗示了这是一个关于Hibernate ORM框架的旧版本分发包,可能是其3.3.1版本的一部分。Hibernate是一个广泛...

    精通Hibernate:对象持久化技术第二版part3

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    Flex+spring+hibernate整合视频part_1

    4. **建立数据访问层**:使用Hibernate的SessionFactory和Session接口,通过注解或XML映射文件来实现对象与数据库表之间的映射。 5. **Spring与Hibernate整合**:将Hibernate的SessionFactory注入到Spring中,通过...

    hiberante4.2.3-part01

    5. **缓存机制**:Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存)。一级缓存默认开启,能提高性能,减少对数据库的访问。二级缓存则可以通过插件如Ehcache实现,可以跨会话共享...

    夏昕《深入浅出Hibernate》配书的一些源代码

    8. **缓存机制**:可能涉及到Hibernate的一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),以及第三方缓存插件如EhCache的配置和使用。 9. **事件监听器**:如PreInsertEventListener、...

    javaweb_part2

    在Java Web开发领域,SSH(Struts 2、Spring、Hibernate)是一个常见的开源框架组合,用于构建高效、灵活的企业级应用程序。这个名为“javaweb_part2”的学习资源可能聚焦于SSH框架的深入理解和实践应用。 **Struts...

Global site tag (gtag.js) - Google Analytics