【问题标题】:How Configure Hibernate for develop Test如何配置 Hibernate 进行开发测试
【发布时间】:2009-07-27 05:46:13
【问题描述】:

我们是 9 位程序员在使用 hibernate 框架的 java Web 应用程序上工作, 但是每次我们想要测试项目时运行(在运行模式,调试模式下)项目都会遇到问题,我们必须等待 Hibernate 创建 SessionFactory 和所有关系查询! 我应该怎么做才能让 Hibernate Work 更快?

【问题讨论】:

  • 在 .NET 中,我通过 IoC 容器保存 NHibernate SessionFactory。下次需要访问数据时,工厂已准备就绪。但这可能是一种不好的做法 - 我不确定。

标签: java hibernate testing


【解决方案1】:

你能详细说明一下需要的时间吗:

  • 是一次,还是每次测试?
  • 你说的到底是多长时间?
  • 什么是休眠负载? (表的数量,或者更好的总列数等......)

根据您的回答,可以调查几个方向,例如通过巧妙的配置实际减少(恐怕只有百分之几)时间......

但我最初的猜测是你可能有一个更聪明的举动,实际上没有为你的测试实例化 Hibernate。这将解决一切,不是吗?虽然这样说可能看起来很愚蠢,但我们就是这样进行的:

  • 我们将 JUnit 测试分为几个类别(基于项目、源目录或其他...)。每个都可以单独运行(如果需要,请询问)。
  • 我们将一个测试类别称为IntegrationTesting,它需要访问昂贵(缓慢或其他)的资源,例如数据库、外部网络服务或其他启动的软件(可能没有并发访问) 、线程、IO、JMS、DLL、昂贵的许可证、x509 证书、负载测量、超时......设置这些测试更复杂,可能无法在每个工作站上执行,并且执行它们需要更多时间。每次开发人员开发此类功能时,他都会经常(或更多)运行适当的测试,并接受延迟。我们的自动构建每天都会运行所有这些,这就是我们确保回归检测的方式。
  • 我们将一个测试类别称为UnitTesting。它不需要访问昂贵的资源,例如它不会触发 Hibernate 初始化。每个开发人员一直在执行这些测试,而且它们的速度很快(对于一个大项目来说几秒钟就够了)!我们不会费心只选择其中一个...

的确,这种测试组织会影响应用程序设计和代码,但这也是当前最佳实践所规定的,因此我们可以从中获得许多优势。示例:

  • 之前:调用 dao 进行数据库通信的业务算法可能如下:
    1. one = dao.readOne()
    2. a = 做算法 A
    3. 二 = dao.readTwo()
    4. b = 做算法 B
    5. if (b) dao.save(one, two, a, b)
  • 之后:我们在不同的类或方法中划分了更多不同的职责:
    1. one = dao.readOne()
    2. 二 = dao.readTwo()
    3. (a,b) = 做算法 AB(one,two)
      • a = 做算法 A(one)
      • b = 做算法 B(二)
    4. if (b) dao.save(one, two, a, b)

以前,我们无法独立于数据库测试“do algo AB”,因为它是包括数据库访问在内的全局过程的一部分(更重要的是,访问与逻辑混合在一起)。

之后,“do algo AB”很容易在 UnitTesting 中进行测试。

我们还发现,先进行只读数据库操作,再进行处理,然后再进行只写数据库操作,有很多优势。

  1. JUnit 性能:如前所述。

    请注意,可以使用 IntegrationTesting 完成 Daos 测试。实际上,在我们的项目中,我们将 JUnit 专注于 UnitTesting,并且很少有 IntegrationTests,我们直接从 UI 测试它们中的大部分...... IntegrationTesting ROI 并不好;-)

  2. 短而集中的事务:例如,我们可以有两个事务(和会话),为复杂的只读阶段享受 Hibernate 身份保证。当算法修改实体时,Hibernate 不会触发隐式更新(我们项目中的早期开发人员不知道这可能发生!)。如果算法决定不更新数据库,则没有时间将数据发送到数据库,无需取消该事务...

  3. 算法的可重用性:我们有很多情况下,用于计算的相应数据已经被之前调用的算法加载了,所以从数据库中重新加载它是一种浪费。此外,重新加载可能会携带不同的数据,从而导致计算脆弱。

  4. ...其他我现在不记得了 ;-)

Junit.org 网站有许多用于测试策略的好资源。 我也很喜欢 Rainsberger 的优秀书籍 (http://www.manning.com/rainsberger/),我绝对推荐它用于任何使用自动化测试并且拥有多个开发人员的项目。 :-)

【讨论】:

    【解决方案2】:

    需要多长时间?我知道这需要一些时间,但不会那么久。如果花费这么多时间,我看不出你能在这里做什么。

    您确定它是需要时间的 sessionfactory,而不是在启动时初始化的应用程序中的其他东西吗?

    您可以使用单元测试来测试部分代码,从而减少整个应用程序的启动。

    【讨论】:

    • ye 瓶颈是 sessionfactory 并且当 Hibernate 想要创建关系查询时。有时不运行 (sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();) 这行代码什么也不做(无异常,无运行)
    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2010-09-29
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    相关资源
    最近更新 更多