2011-11-14 30 views
8

我在调试我们的webapp。它被配置为在启动时创建一个DataSourceTransactionManager bean和一个HibernateTransactionManager bean。这不是有意的,而是由第三方依赖造成的。效果似乎是良性的。通过调试我看到的是,当我们通过基于Hibernate的DAO持久对象时 - 调用DataSourceTransactionManager而不是HibernateTransactionManager(这两个bean都称为“transactionManager”)。 Spring Javadoc意味着(我认为,现在重新阅读它)这对当地资源来说很好 - 这就是我们的情况。即它不是基于分布式JTA的环境。使用DataSourceTransactionManager进行ORM持久化而不是HibernateTransactionManager可以吗?

我的问题是 - 没有使用HibernateTransactionManager进行基于ORM的持久性的任何负面影响。我可以更改配置,使HibernateTransactionManager通过我们的DAO上@Transactional注释的限定符来使用。

事情在简单的单元测试,集成测试设置中工作正常,但是当我们有成千上万的用户和高水平的并发时,我更关心扩展到完整的产量。

TIA, 希望这不是太晦涩。

Spring 3.0.x顺便说一句。

这是在Spring 3.1文档。

Sec 11.9“解决常见问题”。

根据您选择的交易技术和要求,使用正确的PlatformTransactionManager实施。

回答

6

这会引起我的错误并导致问题。如果没有hibernate txn管理器,所有对HibernateOperations的调用都将在一个事务之外并且在一个单独的会话中,可能使用自动提交。因此,当出现错误时,您可能会发现一切正常,您可能会发现您希望回滚的更改不会发生。

请尝试以下方法检查

  • 的begin tran
  • 保存的东西
  • 抛出异常
  • 提交

检查 '东西' 是否出现在DB与否。

另一个检查是

  • 的begin tran
  • 负载的东西
  • 访问的关系从某事物另一个对象与此相关对象的访问属性(而不是PK)

您可能会发现最后一次调用导致异常,因为会话并未从加载保持打开,因为封闭txn不受hibernate txn管理器管理。

+0

+1嗯。有趣。谢谢。将尝试其中一项测试。我所看到的是DAO调用发生在事务中,并且DAO调用getSession() - 所以Spring SessionFactoryUtils返回一个新的会话,并且一切似乎都很好。但正如你所说 - 我们多久会记得休息回滚。 –

+4

不错的一个。我试过这个测试。保存后引发异常,Hibernate tx mgr保存被回滚。使用DataSourceTransactionManager它不是。 –

+0

您能否提供支持您的单词的官方文档“如果没有hibernate txn管理器,所有对HibernateOperations的调用都将在事务之外并在单独的会话中”?我正在使用DataSourceTransactionManager + Hibernate。 – DerekY

相关问题