`
cxshun
  • 浏览: 724125 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate状态和缓存小谈

阅读更多

前几次我们讲了一些比较简单的hibernate的知识,今天开始我们就学到高级啦,哈哈。说到高级总是很激动的。

今天我们就来讲一下hibernate中实体状态和hibernate缓存。

1)首先我们先来看一下实体状态:

实体状态主要分三种:transient,persitent,detached。

看英文应该就大概明白了吧。

transient:是指数据还没跟数据库中的数据相对应。

persistent:是指数据跟数据库中的数据相对应,它的任何改变都会反映到数据库中。

detached:是指数据跟数据库中的数据相对应,但由于session被关闭,它所做的修改不会对数据库的记录造成影响。

下面我们直接代码来:

Transaction tx = session.beginTransaction();
User user = new User();
user.setName("shun");
//这里的user还未保存到数据库,数据库表中并没有与之对应的记录,它为transient状态
session.save(user);
tx.commit();
//提交之后user变为persistent状态
session.close();
//由于session关闭,此时的user为detached状态,它的所有修改都不会反映到数据库中。
		
Session session2 = sessionFactory.openSession();
tx = session2.beginTransaction();
user.setName("shun123");
session2.saveOrUpdate(user);
tx.commit();
//当我们调用了saveOrUpdate之后,user重新变为persistent状态,它的所有修改都会反映到数据库中。
session2.close();

  我们看到代码,首先我们定义了一个对象user,在未保存之前,它就是transient状态,在数据库中并没有与它相应的记录。而当我们进行保存并提交修改后,user成为persistent状态,在数据库中有相应的一条记录。而当我们把session关闭后,user就变成了detached状态了,它的更改并不会反映到数据库中,除非我们手动调用saveOrUpdate等相应的更新和添加方法。而当我们直接想让它从persistent到transient状态,怎么办呢?直接删除就可以了,删除后对象就在数据库中没有对应的记录,也就成transient状态了。

 

hibernate的状态转换还是比较简单的,当是transient状态时,数据库没有记录对应,而persistent和detached时都有对应的记录,但唯一的区别是detached是在session关闭之后才有的状态。那么transient和detached的区别又是什么呢?就是有没有数据库表记录对应的问题。

 

2)看完了状态我们来看一下hibernate的缓存

hibernate的缓存分两种,一级缓存和二级缓存。

一级缓存:所谓的一级缓存也就是内部缓存。

二级缓存:它包括应用级缓存,在hibernate就是所谓的SessionFactory缓存,另外一个是分布式缓存,这个是最安全的缓存方式。

直接来看程序:

public static void main(String[] args) {

	Configuration cfg = new Configuration().configure();
	SessionFactory sessionFactory = cfg.buildSessionFactory();
	Session session = sessionFactory.openSession();
		
	User user = (User)session.load(User.class,new Long(29));
	System.out.println(user.getName());
		
	User user2 = (User)session.load(User.class,new Long(29));
	System.out.println(user2.getName());
		
	session.close();
}

  看结果:

Hibernate: select user0_.USER_ID as USER1_0_0_, user0_.USER_NAME as USER2_0_0_, user0_.age as age0_0_ from USER user0_ where user0_.USER_ID=?
shun123123
shun123123

例子中我们用了两次load,但结果中只有一句SQL语句,这表明它只查询了一次。

为什么呢?这也就是hibernate的缓存起作用了。第一次查询完毕后,hibernate后把查出来的实体放在缓存中,下一次查的时候首先会查缓存,看有没有对应ID的实体存在,如果有则直接取出,否则则进行数据库的查询。

 

下面我们把代码修改成:

User user = (User)session.load(User.class,new Long(29));
System.out.println(user.getName());
		
session.evict(user);//把user从缓存中删掉
		
User user2 = (User)session.load(User.class,new Long(29));
System.out.println(user2.getName());
		
session.close();

  看到结果:

Hibernate: select user0_.USER_ID as USER1_0_0_, user0_.USER_NAME as USER2_0_0_, user0_.age as age0_0_ from USER user0_ where user0_.USER_ID=?
shun123123
Hibernate: select user0_.USER_ID as USER1_0_0_, user0_.USER_NAME as USER2_0_0_, user0_.age as age0_0_ from USER user0_ where user0_.USER_ID=?
shun123123

  自己我们把user从缓存中删除后,第二次的查询也直接从数据库中取出。

 

二级缓存涉及到的内容比较多,我们在下次再仔细学习一下。

1
1
分享到:
评论

相关推荐

    hibernate一级缓存和二级缓存的区别与联系

    总结来说,Hibernate 的一级缓存和二级缓存都是为了提高数据访问效率,但它们在范围和并发控制方面有所不同。一级缓存是事务级别的,保证了数据的强一致性,而二级缓存提供了更多的灵活性,可以跨事务共享,但需要...

    hibernate一级缓存、二级缓存和查询缓存

    **hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...

    Hibernate一级缓存和二级缓存

    标题“Hibernate一级缓存和二级缓存”指的是Hibernate框架中的两种缓存机制,它们是提高数据访问性能的关键要素。一级缓存是Session级别的,而二级缓存是SessionFactory级别的,两者在数据库操作中起到了重要的作用...

    Hibernate二级缓存

    总结来说,Hibernate的二级缓存和查询缓存是提升性能的重要手段,但正确配置和使用它们至关重要,以免带来不必要的性能损失。通过合理的缓存策略和配置,可以有效地减少数据库交互,提升应用的响应速度。

    hibernate二级缓存实例

    总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...

    hibernate 二级缓存详解

    在Hibernate中,二级缓存可以使用不同的提供商,例如Ehcache和OSCache。配置Ehcache作为二级缓存提供商,需要在Hibernate的配置文件中设置`hibernate.cache.provider_class`为`...

    hibernate二级缓存示例源码

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

    hibernate二级缓存

    在Hibernate框架中,缓存分为一级缓存和二级缓存。 一级缓存是默认开启的,它与Session对象关联,主要负责在同一个事务内部管理对象的状态。一级缓存会跟踪所有在事务中被修改的对象,确保在事务提交时仅生成必要的...

    hibernate二级缓存包

    综上所述,Hibernate二级缓存配合Ehcache使用,能够有效提升Java应用的性能,降低数据库压力,同时Ehcache提供的丰富功能和灵活性使其成为Java缓存领域中的热门选择。在实际项目中,正确配置和使用Ehcache,能够为...

    hibernate一级缓存

    在Hibernate的源码中,一级缓存主要由`org.hibernate.engine.internal.StatefulPersistenceContext`类实现,它维护了对象的状态信息。通过跟踪源码,我们可以了解缓存的添加、查询、更新等操作的具体实现细节。 ###...

    Hibernate一级缓存、二级缓存以及查询缓存实例

    本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...

    Hibernate 二级缓存

    Hibernate 二级缓存

    Hibernate 一级缓存和二级缓存的区别

    Hibernate 一级缓存和二级缓存的区别

    hibernate二级缓存java包下载

    Hibernate 支持事件驱动的更新机制,如监听器(Listener)和拦截器(Interceptor),以便在数据变更后正确处理缓存。 7. **缓存过期与失效**: - 设置缓存项的生命周期或基于访问频率来决定何时清理缓存,防止内存...

    hibernate缓存和事务

    Hibernate 提供了两级缓存机制:第一级缓存和第二级缓存。 1. **第一级缓存**:这是SessionFactory级别的缓存,每个SessionFactory实例都有自己的第一级缓存。当对象被持久化或者从数据库加载时,它们会被放入第一...

    Spring集成的Hibernate配置二级缓存

    在Hibernate中,一级缓存是每个Session内部的缓存,它自动管理实体的状态,当一个实体被加载到Session后,该实体的状态就会被缓存。然而,一级缓存的范围仅限于单个Session,当Session关闭后,其中的数据就会丢失。...

    Hibernate 二级缓存 总结整理

    通过理解和运用Hibernate的二级缓存,我们可以优化应用性能,减少数据库压力,但同时也需要注意缓存可能带来的问题,如数据一致性、内存管理和并发控制等。在实际项目中,结合业务需求和系统特点,合理配置和管理...

    day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    `hibernate.cache.use_query_cache`和`hibernate.cache.use_second_level_cache`分别开启了查询缓存和二级缓存。最后,通过`class-cache`元素配置了`EntityClass`的缓存策略,这里使用了"read-write",表示读写操作...

Global site tag (gtag.js) - Google Analytics