我该如何配置休眠 http://www.hibernate.org/在会话执行每个操作后立即将所有保存、更新和删除应用到数据库服务器?默认情况下,Hibernate 将所有保存、更新和删除操作排入队列,并仅在经过一段时间后才将它们提交到数据库服务器。flush()
操作、提交事务或关闭发生这些操作的会话。
立即刷新数据库“写”操作的好处之一是程序可以捕获并处理任何数据库异常(例如约束违反异常 http://docs.jboss.org/hibernate/core/3.3/api/index.html?org/hibernate/exception/ConstraintViolationException.html) 在它们出现的代码块中。对于延迟或自动刷新,这些异常可能会在导致 SQL 操作的相应 Hibernate 操作很久之后发生。
Update:
根据Hibernate API文档获取接口Session http://docs.jboss.org/hibernate/stable/core/api/org/hibernate/Session.html,在会话结束之前捕获并处理数据库异常的好处可能根本没有任何好处:“如果会话抛出异常,则必须回滚事务并丢弃会话。会话的内部状态可能不异常发生后与数据库一致。”
那么,也许用 try-catch 块围绕“立即”Hibernate 会话写入操作的好处是在异常发生时立即捕获并记录异常。立即冲洗这些操作还有其他好处吗?
如何配置 Hibernate 在会话执行每个操作后立即将所有保存、更新和删除应用到数据库服务器?
据我所知,Hibernate 没有为此提供任何设施。然而,看起来 Spring 确实如此,而你可以进行一些数据访问操作FLUSH_EAGER http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateAccessor.html#FLUSH_EAGER通过转动他们的HibernateTemplate http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html分别HibernateInterceptor http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateInterceptor.html到冲洗模式 (source https://forum.hibernate.org/viewtopic.php?p=2183346#p2183346).
但我强烈建议阅读javadoc小心(我会回来讨论这一点)。
默认情况下,Hibernate 将所有保存、更新和删除操作排入队列,并仅在执行了flush() 操作、提交事务或关闭发生这些操作的会话后才将它们提交到数据库服务器。
关闭会话不会刷新。
立即刷新数据库“写入”操作的好处之一是,程序可以捕获并处理发生异常的代码块中的任何数据库异常(例如 ConstraintViolationException)。使用延迟或自动刷新,这些异常可能会在导致 SQL 操作的相应 Hibernate 操作很久之后发生
首先,DBMS 在插入(或更新)或后续提交(这称为立即或延迟的约束)。因此,没有任何保证,您的 DBA 甚至可能不希望立即受到约束(但这应该是默认行为)。
其次,我个人认为立即冲洗的缺点多于好处,正如 javadoc 中白纸黑字所解释的那样FLUSH_EAGER http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateAccessor.html#FLUSH_EAGER:
急切的冲水会导致立即
与数据库同步,
即使在交易中。这导致
不一致的情况出现并抛出
立即出现相应的异常,并且
参与的 JDBC 访问代码
同一笔交易将会看到
数据库已经发生变化
那时就意识到他们了。但缺点
是:
- 与数据库的额外通信往返,而不是单个通信
事务提交时批处理;
- 事实上,如果 Hibernate 发生故障,则需要实际的数据库回滚
事务回滚(由于已经
提交的 SQL 语句)。
相信我,增加数据库往返次数和丢失语句批处理可能会导致主要性能下降.
另请记住,一旦出现异常,除了放弃会话之外,您无能为力。
总而言之,我很高兴 Hibernate 将各种操作排队,我当然不会使用它EAGER_FLUSH
flushMode
作为一般设置(但可能仅适用于实际需要急切的特定操作,如果有的话)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)