【问题标题】:Hibernate sessionFactory rebuilt for each unit test (using spring framework)Hibernate sessionFactory为每个单元测试重建(使用spring框架)
【发布时间】:2010-03-04 17:02:26
【问题描述】:

我正在使用 Spring 的 AbstractTransactionalDataSourceSpringContextTests 进行我的持久性单元测试,我的问题是我的测试太慢了:1 个方法 = 5 秒,每个附加方法至少需要一秒。我有超过 300 个 db 表,因此启动缓慢也许是可以理解的。然而,我浏览了日志,其中一件令人惊讶的事情是 Hibernate sessionFactory 是为每个测试方法重建的。而且它是每个附加方法运行时成本的一半。

难道我不能重用原来的 sessionFactory 吗?

我已经深入研究了源代码,但还没有看到强制重用 sessionFactory 的明显方法。

有什么想法吗?

还有其他加快持久性单元测试的想法吗?

(Spring 2.5 和 Hibernate 3.2ish,hsqldb)

【问题讨论】:

  • 如果我的答案是您问题的解决方案,也许将其标记为这样可以帮助其他人更快地跟踪解决方案? =)
  • 无意冒犯,因为我感谢任何回应,但含糊地提及包装器并将静态加粗几乎不构成解决方案。

标签: java unit-testing hibernate spring


【解决方案1】:

你应该写一个帮助类,这样你就可以包装你的ISessionFactory API,你最好把它静态,所以它只创建一次,因为这个API实例化非常昂贵。

【讨论】:

    【解决方案2】:

    您应该尝试找到创建 sessionFactories 的位置(我敢打赌,在每个 setUp() 方法中都会以某种方式创建一个新的)。然后你可以将创建移到一个单独的类中,也许是一个静态方法,它确保在内部只创建它的一个实例(有点像单例)。

    【讨论】:

      【解决方案3】:

      我们的整个 SpringContext 每次都会刷新,我认为这与我们所做的一些动态弹簧上下文杂耍有一定的关系。然而,杂耍是在每个类的基础上进行的,因此完全没有必要对每个方法进行刷新。

      “解决方案”,例如,是跳过上下文刷新,避免会话工厂重新创建。

      我仍然不确定为什么 Spring 觉得每次刷新都需要从头开始重建会话工厂。我想为他们重建是进行会话刷新的最简单方法,但希望不是最快的。

      感谢您的回复。

      【讨论】:

      • Brel,您是如何在每次测试期间跳过 spring 上下文刷新和会话工厂创建的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 2018-03-22
      • 2019-12-10
      相关资源
      最近更新 更多