【问题标题】:Hibernate Doesn't Flush Fast Enough to Catch DB ExceptionsHibernate 刷新速度不够快,无法捕获数据库异常
【发布时间】:2012-05-08 18:16:31
【问题描述】:

我在 Try/Catch 块内有一个方法,它调用 Hibernate DB Save 操作来插入一行。

即使存在 DB 问题,该方法也会成功完成(例如,当我将 NULL 插入非 NULL 列时)。然后,在稍后的某个时间点,Hibernates 会尝试“刷新”或完成事务,这就是引发错误的时候。

这会打乱我的代码流程,因为我依赖于我的方法成功完成来做其他事情,例如发送电子邮件。调用我的方法后,我继续发送电子邮件,假设没有发生错误(否则我会被抛出我的代码流并进入我的 Catch 块,但这是不是发生)。

有没有人知道如何处理这种情况?

【问题讨论】:

  • 您使用什么样的事务管理/策略?如果您希望将事情提交到数据库,您应该使用显式事务。依赖隐式事务绝不是一个好主意...hibernateprofiler.com/learn/alerts/DoNotUseImplicitTransactions
  • 我不确定,但是有没有办法在休眠层上立即自动刷新? (我不是在谈论 DB 层,它仍然是一个事务。)
  • 您为什么没有收到异常?像 Hibernate 或 JDBC 异常?

标签: java database hibernate exception transactions


【解决方案1】:

简单的答案是简单地调用Session.flush(),任何挂起的 SQL 都会运行,从而导致当时可能潜伏发生的任何 SQL 异常。

在更大的范围内,您可能希望查看在应用程序级别验证数据的选项,而不是依赖 SQL 异常来检测错误。当然,这两种方式都有利有弊。

【讨论】:

  • 我不鼓励使用显式调用 Session.flush(),需要这样做几乎总是表明您错误地使用了 Hibernate 框架。我同意你关于应用程序为你验证事情的观点。这可以通过扩展您的 hbm.xml 映射文件以包含您添加到数据库的约束来完成。这具有 hbm2ddl 工具的额外(良好)副作用,如果您使用它,它会创建一个更接近真实的架构。
  • 那么我们如何准确地知道 Hibernate 何时刷新?如果我不使用flush(),我怎么知道何时检查错误?
  • 通常它会在运行查询之前刷新(除非您更改该配置),在提交之前以及调用 flush() 时。 API 不向您保证其他时间。需要大量显式地 flush() 表明您的应用程序设计是“考虑数据库”,而应该“考虑应用程序”并让 hibernate 担心数据库。当然,有时您对此无能为力,而事情只需要发挥作用即可。
  • 另外请注意,如果您使用 spring 来管理您的事务,那么最终刷新发生的时间取决于为您的调用层次结构定义的事务语义。一般来说,当 spring 决定提交你的事务时,hibernate 会刷新。
  • 值得注意的是,有一个休眠设置可以将其配置为在每个命令上刷新。默认值为 AUTO,但可以设置为 ALWAYS,这通常会对性能造成重大影响...docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/…
猜你喜欢
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2020-05-09
  • 1970-01-01
相关资源
最近更新 更多