`
king_lm
  • 浏览: 8166 次
社区版块
存档分类
最新评论

Hibernate的session是否是同一实例(一)

阅读更多

 

看下面这个测试:

1.测试用到的类,AService其中有2个方法分别是f1(); f2(); AServiceImpl中对于两个方法的实现:

  @Override
  public void f1() {
    Session session = getSession();
    logger.debug(session.hashCode());
  }

  @Override
  public void f2() {
    f1();
    f1();
  }

 

 

2.使用spring aop将事务配置在AService的任意方法上。

3.TestCase代码如下:

 

  @Test
  public void testList() throws ParseException, InterruptedException {
    log.debug("invoke f1 2 times");
    aService.f1();
    aService.f1();

    log.debug("invoke f2 ");
    aService.f2();
  }

 

运行结果如下:

 

2013-07-25 16:31:26,359 [DEBUG] ****testList(DataSourceTestCase.java:18) - invoke f1 2 times

2013-07-25 16:31:26,375 [DEBUG] ****.f1(FundProfileServiceImpl.java:25) - 15095802

2013-07-25 16:31:26,390 [DEBUG] ****.f1(FundProfileServiceImpl.java:25) - 27653884

2013-07-25 16:31:26,390 [DEBUG] ****.testList(DataSourceTestCase.java:22) - invoke findForTest2 

2013-07-25 16:31:26,390 [DEBUG] ****.f1(FundProfileServiceImpl.java:25) - 19997070

2013-07-25 16:31:26,406 [DEBUG] ****.f1(FundProfileServiceImpl.java:25) - 19997070

 

 

可见在testList方法中调用的两次f1,对应的session不是同一个实例。

f2调用的两次f1中对应的session是同一实例。

 

原因应该是这样:

在testList方法中调用的两次f1,是两个不同的事务。f2调用的两次f1是在同一事务中。

对吧?应该不确切。

 

 

分享到:
评论

相关推荐

    hibernate中session的管理

    由于Servlet容器(如Tomcat)通常只创建一个Servlet实例供所有请求共享,每个线程在执行时可能会访问到同一份Session,导致数据错乱。 为了解决这个问题,我们可以采用ThreadLocal。ThreadLocal是Java提供的一种...

    hibernate二级缓存实例

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

    hibernate的核心接口--Session

    Hibernate 保证同一 Session 实例缓存中的每个数据库记录仅对应一个持久化实例。 - **行为**: 在 Session 清理缓存时,会根据持久化实例的属性变化来同步更新数据库。 **3. 脱管状态 (detached)** - **定义**: ...

    Hibernate 缓存 实例

    在同一个Session内,对于同一对象的多次加载或获取(如load和get方法),不会重复执行SQL,因为数据会从一级缓存中获取。以下是一级缓存的示例代码: ```java public class CacheLevel1Test extends TestCase { //...

    hibernate的一级缓存和二级缓存

    一级缓存,也称为Session缓存,是每个Hibernate Session实例私有的。当Session执行查询操作时,会将结果存储在一级缓存中。如果同一Session再次执行相同的查询,Hibernate将直接从一级缓存获取数据,避免了重复的...

    Struts+Spring+Hibernate开发实例 (SSH整合)

    Spring的Hibernate支持可以自动管理Session和事务,但在某些特定情况下,如需要自定义SQL查询或Criteria查询,我们需要扩展Spring的功能。为此,定义了一个IBase接口和BaseDao实现类,模仿HibernateTemplate的功能,...

    hibernate持久化对象生命周期[参照].pdf

    - Hibernate保证每个Session实例的缓存中,每条数据库记录仅对应一个持久化对象。这意味着在不同Session实例中,相同数据库记录可能会有不同的持久化对象实例。 - 如果试图让一个Java对象同时被两个Session实例...

    HIBERNATE的缓存机制

    这意味着在同一个Session内,对同一对象的多次读取和写入都会在缓存内完成,无需重复查询数据库。每个持久化类实例都有唯一的OID(对象标识符),确保了数据的唯一性。当事务结束时,Session会将所有未提交的更改...

    强人Hibernate文档笔记

    【强人Hibernate文档笔记】是针对Hibernate框架的深入学习资料,涵盖了对象定义、实例状态、JMX集成和JCA支持等关键概念。以下是对这些内容的详细解释: **一、对象定义** 1. **SessionFactory**: SessionFactory是...

    Hibernat一级缓存(源码)

    一级缓存位于 Session 对象中,是每个 Session 的私有缓存,它存储了从数据库中读取的对象实例。 一级缓存的工作原理: 1. 当我们通过 Hibernate 的 Session 加载或保存一个实体时,这个实体会被放入一级缓存中。 2...

    hibernate缓存和事务

    Hibernate 是一个流行的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。在Java应用程序中,Hibernate 提供了一种便捷的方式,将数据模型类与数据库表进行映射,使得开发者无需直接编写...

    Hibernate 帮助文档

    这种方式需要一个额外的表来存储高位值,以确保同一数据库中主键的唯一性。Hilo方式与底层数据库无关,但不适用于多数据库环境。 3. **Increment**:对于支持序列(Sequence)的数据库,如Oracle、DB2等,可以选择...

    hibernate缓存

    1. **一级缓存**:一级缓存是每个Hibernate Session实例的私有缓存,它自动管理对象的生命周期。当持久化对象被加载到内存时,它们会被添加到一级缓存中。当在同一个Session中再次访问这些对象时,Hibernate会首先从...

    Hibernate缓存深入详解

    在同一个Session内,对同一对象的多次查询会直接从缓存中获取,提高了效率。 **4. 二级缓存(SessionFactory缓存)** 二级缓存是可选的,可以用来存储跨多个Session的数据。它可以被配置为进程内缓存或分布式缓存...

    hibernate面试题大全

    - **缺点**:如果应用程序试图访问一个已经游离状态的对象的代理实例,而该实例在持久化状态时未被初始化,那么将会抛出异常,因为游离状态下的代理实例不再与Session关联,无法通过Hibernate进行加载。 #### 3. ...

    Hibernate缓存策略(一级缓存、二级缓存).docx

    当我们在同一个Session内多次读取同一对象时,Hibernate会首先检查一级缓存,如果找到,就直接从缓存中获取,而不会再次执行SQL查询。例如,上面的测试代码演示了这一点:在同一个Session中,通过load方法加载同一个...

    hibernate面试题

    - 在Hibernate中,同一Session内加载的相同主键的对象被视为同一个对象实例。 - 因此,`c1 == c2`返回的是`true`。 正确答案为:**C) 印出true**。 #### 7. 数据库更新次数 题目描述了修改Customer名称的过程。...

Global site tag (gtag.js) - Google Analytics