gpt4 book ai didi

java - FlushMode.AUTO后面检查了什么?

转载 作者:搜寻专家 更新时间:2023-11-01 01:29:05 24 4
gpt4 key购买 nike

在 Hibernate 中,我想知道当 flushMode 为 AUTO 时哪些条件会触发刷新?它可能很复杂(或“神奇”),但基本条件是什么?

谢谢

最佳答案

flush modeFlushMode.AUTO 它会在以下时间发生:

  • 在执行查询之前
  • 当提交 Hibernate API 上的事务时
  • 当应用程序显式调用 session.flush() 时

此模式的目的是避免“过时”状态。对内存中对象所做的更改可能会与查询结果发生冲突。我的理解是 Hibernate 会进行“脏检查”,比较对象的原始状态和当前状态。如果它们不同并且 Hibernate 认为这种差异会使您暴露于陈旧数据,它会尝试将这种状态推送到数据库。这是可能的,因为 Hibernate 知道哪些表将被查询“触及”,以及它需要为当前脏状态更新哪些表。

看看这个article :

Auto-flushing is quite intelligent in what to flush when, although some situations might be hard to detect. To improve performance, Hibernate will not simply always flush everything, but look at the tables in the database that the query touches and the data in-memory that should be stored in those tables. If there is no overlap, no data will be persisted. If an overlap is found, the whole session will be flushed, to ensure consistency.

您还可以查看 org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush source code .

FlushMode.AUTO 有几个缺点:

  • 您无法控制 Hibernate 何时决定执行 UPDATE/INSERT/DELETE
  • 潜在的性能问题,因为每个对象修改都可能导致脏检查 + DML 语句执行
  • 您没有利用 Hibernate 在不尝试避免“陈旧”状态时可以执行的批处理和其他优化

由于这些缺点,我更喜欢 FlushMode.COMMIT,它可以让您更好地控制。在这种模式下,Hibernate 一直等到您显式调用 Commit 或 Flush,之后才将内存状态与数据库同步。

关于java - FlushMode.AUTO后面检查了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com