看下面这个测试:
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是在同一事务中。
对吧?应该不确切。
相关推荐
由于Servlet容器(如Tomcat)通常只创建一个Servlet实例供所有请求共享,每个线程在执行时可能会访问到同一份Session,导致数据错乱。 为了解决这个问题,我们可以采用ThreadLocal。ThreadLocal是Java提供的一种...
总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...
Hibernate 保证同一 Session 实例缓存中的每个数据库记录仅对应一个持久化实例。 - **行为**: 在 Session 清理缓存时,会根据持久化实例的属性变化来同步更新数据库。 **3. 脱管状态 (detached)** - **定义**: ...
在同一个Session内,对于同一对象的多次加载或获取(如load和get方法),不会重复执行SQL,因为数据会从一级缓存中获取。以下是一级缓存的示例代码: ```java public class CacheLevel1Test extends TestCase { //...
一级缓存,也称为Session缓存,是每个Hibernate Session实例私有的。当Session执行查询操作时,会将结果存储在一级缓存中。如果同一Session再次执行相同的查询,Hibernate将直接从一级缓存获取数据,避免了重复的...
Spring的Hibernate支持可以自动管理Session和事务,但在某些特定情况下,如需要自定义SQL查询或Criteria查询,我们需要扩展Spring的功能。为此,定义了一个IBase接口和BaseDao实现类,模仿HibernateTemplate的功能,...
- Hibernate保证每个Session实例的缓存中,每条数据库记录仅对应一个持久化对象。这意味着在不同Session实例中,相同数据库记录可能会有不同的持久化对象实例。 - 如果试图让一个Java对象同时被两个Session实例...
这意味着在同一个Session内,对同一对象的多次读取和写入都会在缓存内完成,无需重复查询数据库。每个持久化类实例都有唯一的OID(对象标识符),确保了数据的唯一性。当事务结束时,Session会将所有未提交的更改...
【强人Hibernate文档笔记】是针对Hibernate框架的深入学习资料,涵盖了对象定义、实例状态、JMX集成和JCA支持等关键概念。以下是对这些内容的详细解释: **一、对象定义** 1. **SessionFactory**: SessionFactory是...
一级缓存位于 Session 对象中,是每个 Session 的私有缓存,它存储了从数据库中读取的对象实例。 一级缓存的工作原理: 1. 当我们通过 Hibernate 的 Session 加载或保存一个实体时,这个实体会被放入一级缓存中。 2...
Hibernate 是一个流行的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。在Java应用程序中,Hibernate 提供了一种便捷的方式,将数据模型类与数据库表进行映射,使得开发者无需直接编写...
这种方式需要一个额外的表来存储高位值,以确保同一数据库中主键的唯一性。Hilo方式与底层数据库无关,但不适用于多数据库环境。 3. **Increment**:对于支持序列(Sequence)的数据库,如Oracle、DB2等,可以选择...
1. **一级缓存**:一级缓存是每个Hibernate Session实例的私有缓存,它自动管理对象的生命周期。当持久化对象被加载到内存时,它们会被添加到一级缓存中。当在同一个Session中再次访问这些对象时,Hibernate会首先从...
在同一个Session内,对同一对象的多次查询会直接从缓存中获取,提高了效率。 **4. 二级缓存(SessionFactory缓存)** 二级缓存是可选的,可以用来存储跨多个Session的数据。它可以被配置为进程内缓存或分布式缓存...
- **缺点**:如果应用程序试图访问一个已经游离状态的对象的代理实例,而该实例在持久化状态时未被初始化,那么将会抛出异常,因为游离状态下的代理实例不再与Session关联,无法通过Hibernate进行加载。 #### 3. ...
当我们在同一个Session内多次读取同一对象时,Hibernate会首先检查一级缓存,如果找到,就直接从缓存中获取,而不会再次执行SQL查询。例如,上面的测试代码演示了这一点:在同一个Session中,通过load方法加载同一个...
- 在Hibernate中,同一Session内加载的相同主键的对象被视为同一个对象实例。 - 因此,`c1 == c2`返回的是`true`。 正确答案为:**C) 印出true**。 #### 7. 数据库更新次数 题目描述了修改Customer名称的过程。...