`

Spring测试中Hiberante session缓存问题

阅读更多
测试很关键..没有测试的代码是遗留代码...

Spring给测试提供了好多方便之处.

引用

使用Junit直接进行单元测试有以下四大不足:

  1)导致多次Spring容器初始化问题

  根据JUnit测试方法的调用流程,每执行一个测试方法都会创建一个测试用例的实例并调用setUp()方法。由于一般情况下,我们在setUp()方法中初始化Spring容器,这意味着如果测试用例有多少个测试方法,Spring容器就会被重复初始化多次。虽然初始化Spring容器的速度并不会太慢,但由于可能会在Spring容器初始化时执行加载Hibernate映射文件等耗时的操作,如果每执行一个测试方法都必须重复初始化Spring容器,则对测试性能的影响是不容忽视的;

  -->使用Spring测试套件,Spring容器只会初始化一次!

  2)需要使用硬编码方式手工获取Bean

  在测试用例类中我们需要通过ctx.getBean()方法从Spirng容器中获取需要测试的目标Bean,并且还要进行强制类型转换的造型操作。这种乏味的操作迷漫在测试用例的代码中,让人觉得烦琐不堪;

  -->使用Spring测试套件,测试用例类中的属性会被自动填充Spring容器的对应Bean ,无须在手工设置Bean!

  3)数据库现场容易遭受破坏

  测试方法对数据库的更改操作会持久化到数据库中。虽然是针对开发数据库进行操作,但如果数据操作的影响是持久的,可能会影响到后面的测试行为。举个例子,用户在测试方法中插入一条ID为1的User记录,第一次运行不会有问题,第二次运行时,就会因为主键冲突而导致测试用例失败。所以应该既能够完成功能逻辑检查,又能够在测试完成后恢复现场,不会留下“后遗症”;

  -->使用Spring测试套件,Spring会在你验证后,自动回滚对数据库的操作,保证数据库的现场不被破坏,因此重复测试不会发生问题!

  4)不方便对数据操作正确性进行检查

  假如我们向登录日志表插入了一条成功登录日志,可是我们却没有对t_login_log表中是否确实添加了一条记录进行检查。一般情况下,我们可能是打开数据库,肉眼观察是否插入了相应的记录,但这严重违背了自动测试的原则。试想在测试包括成千上万个数据操作行为的程序时,如何用肉眼进行检查?

  -->只要你继承Spring的测试套件的用例类,你就可以通过jdbcTemplate在同一事务中访问数据库,查询数据的变化,验证操作的正确性!


在用spring做测试的时候,会选择强大的AbstractTransactionalDataSourceSpringContextTests类.

但从过去的帖子里都会看到的问题身影
http://www.iteye.com/article/40451
http://www.iteye.com/topic/70008

最近在使用spring测试的时候也出现了类似的问题.
这个问题不同于以上两个帖子.
结果是一样的,测试不通过..
但不是数据库没有执行.
因为在使用setComplete()方法之后,数据库中的数据都成功完成.说明不是事务问题.
但在查询的时候依然是上一次查询的数据..
这就是一级缓存在作怪.

引用

Remember that you can clear the Hibernate session, removing objects already associated with it. This is often necessary before requerying in tests, and solves most (if not all) problems.
I typically use JDBC for verification. The pattern is
- do Hibernate operation
- flush Hibernate session
- issue JDBC query to verify results

That way I'm verifying what Hibernate did to the database in the same transaction.
__________________
Rod Johnson - CEO, Interface21
http://www.springframework.com - Spring From the Source
Training, Consulting, Support


使用flush方法是使数据库操作.flush是把数据与数据库同步...
要清除缓存中的数据要使用evict或者clear方法.
但总不能为了测试,在DAO中查询后清下缓存吧..那太不合理了.

http://www.iteye.com/topic/18826
这个帖子里给出了解决之道
在测试超类中写上
protected void flushSession();{   
        SessionFactory sessionFactory =    
            (SessionFactory)applicationContext.getBean("sessionFactory");  
        sessionFactory.getCurrentSession().flush();
sessionFactory.getCurrentSession().clear();      
    }  


在测试方法中,如果要查询已查询过的数据,可以在查询之前用调用下这个方法..
1
0
分享到:
评论

相关推荐

    疯狂Ajax讲义3+Spring+hiberante

    《疯狂Ajax讲义3》是针对Web开发领域中Ajax技术的深入学习资料,结合Spring和Hibernate两大框架,为读者提供了一套完整的前后端交互及数据管理解决方案。这三者组合在一起,构成了现代Web应用程序开发的核心技术栈。...

    疯狂Ajax讲义5+Spring+hiberante

    "疯狂Ajax讲义5+Spring+hiberante" 这个标题和描述暗示了我们即将探讨的主题是关于Web开发中的三个关键技术和框架:Ajax、Spring和Hibernate。Ajax(Asynchronous JavaScript and XML)是一种用于创建动态网页的技术...

    疯狂Ajax讲义+Spring+hiberante

    4. **缓存机制**:Hibernate支持一级缓存(Session缓存)和二级缓存(可选),以提高数据访问性能。 5. **事务管理**:Hibernate整合了JTA(Java Transaction API)和JPA(Java Persistence API)的事务处理,确保...

    DAO层中对Hiberante

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它允许...然而,需要注意的是,对于大型应用,可能还需要考虑进一步的优化,比如使用Spring的声明式事务管理,以减少代码中的事务控制逻辑。

    springmvc hiberante

    Spring MVC 和 Hibernate 是两个在Java Web开发中广泛使用的框架,它们分别是用于构建MVC(Model-View-Controller)架构的Web应用和管理数据库操作的对象关系映射(ORM)工具。在实际项目中,这两个框架的集成能提供...

    hiberante 学习PDF

    Hibernate 提供了两级缓存:一级缓存(session 缓存)和二级缓存(全局缓存)。合理使用缓存可以显著提高应用程序的性能。 #### 映射策略 - **一对一、一对多、多对一和多对多**:Hibernate 支持各种复杂的关系...

    hiberante基础介绍

    在项目中配置 Hibernate,包括数据库连接信息、实体类的映射文件(通常为 XML 或注解形式),然后就可以通过 Hibernate 提供的 Session 接口进行数据操作,如 CRUD(创建、读取、更新、删除)操作。 总之,...

    hibernate + shardingjdbc +springboot 结合做的demo

    在这个示例中,我们将探讨如何将Hibernate ORM框架、ShardingSphere的ShardingJDBC模块与Spring Boot整合,构建一个高效的分布式数据库应用。这样的组合允许我们利用Hibernate的强大ORM能力,同时通过ShardingJDBC...

    hibernate\Hibernate开发资料整合1

    根据压缩包子文件的文件名称列表:“spring”、“struts”、“hiberante”(可能是“hibernate”的拼写错误),我们可以推测这些文件可能包含Spring、Struts和Hibernate的配置示例、教程文档或者示例项目。Spring与...

    hibernate2ch_reference.pdf

    Hibernate内置了第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存)。二级缓存可通过插件如Ehcache实现,能提高数据访问效率,但也需注意缓存一致性问题。 11. **多对一、一对多、多对多...

    学习hibernate时记的笔记

    Hibernate提供了两层缓存:第一级缓存是Session级别的,每个Session都有自己的缓存;第二级缓存是SessionFactory级别的,可以跨Session共享。 ### 5. 异构查询(HQL和Criteria API) - HQL:类似于SQL,但操作对象...

    支持多数据库的ORM框架ef-orm.zip

    实际性能测试表明,EF的大部分操作都要快于Hiberante和MyBatis, 部分操作速度甚至数十倍于上述框架。 EF在极限插入模式下,甚至刷新了每秒10万条写入的记录。远远超过了其他框架。 一个初步的性能测试:测试代码...

Global site tag (gtag.js) - Google Analytics