【问题标题】:Hibernate Session.flush() efficiency problemsHibernate Session.flush() 效率问题
【发布时间】:2012-08-24 14:28:32
【问题描述】:

如果有人已经回答了这个特定的问题,但我还没有找到我的问题的答案,那么请提前抱歉。

我正在开发一个应用程序(不,我不能为工作提供代码,所以我很抱歉那个),它使用 DAO 和 Hibernate 和 POJO 以及所有用于通信和写入数据库的东西。假设我在调用 Session.flush() 时没有大量数据要检查,这对于应用程序来说效果很好。话虽如此,有一个页面,用户可以在其中向产品添加任意数量的项目,并且有一个特殊情况,其中有 25 个项目。每个项目大约有 8 个字段,它们都存储在数据库中。当我调用刷新时,它会将所有内容保存到数据库中,但需要 FOREVER 才能完成。我打电话的三行是:

merge(myObject);
Session.flush();
Session.refresh(myObject);

我已经尝试了许多不同的组合来解决这个问题和许多不同的解决方案,所以回来说“不要使用flus()”并没有太大帮助,因为 saveOrUpdate() 和其他休眠会话似乎不起作用。我能想到的唯一解决方案是废弃整个项目(我们得到的代码是继承的,至少可以说写得不好),或者告诉用户社区接受它。

我从 Hibernate API 了解到,如果您想将数据写入数据库,它会检查每个项目,如果存在差异,它会创建一个更新查询队列,然后运行查询。似乎每次都在更新此数据,因为即使其他值未更改,我的数据库中的“DATE_CREATED”列也不同。

我想知道是否有另一种方法可以防止提交如此大量的数据,或者是否有一种方法可以从“检查”休眠中排除该特定列,这样我就不必提交所有 25 个项目,如果我只改成 1 了吗?

提前致谢。

迈克

【问题讨论】:

  • 25 并不是很多,除非对象是巨大的。无论如何,每个项目是在自己的会话中处理,还是在刷新之前都被添加到会话中?
  • 好吧,事实证明它更像是 60 多个对象哈哈。我不记得有多少,但现在有多少。不过,每个项目都被添加到同一个会话中,最后我调用了flush。我尝试将 POJO 中的 dateCreated 字段设置为 updatable=false,以确保不会在该字段上发生检查,这是问题所在,但没有奏效。有什么想法吗?
  • 你需要弄清楚是什么花费了时间。是对象操作,数据库插入,等等......
  • 需要这么长时间的事实是,所有对象都在根据数据库进行检查,并且由于每个对象的时间戳都与上次修改时不同,因此根据需要将其标记为更新。我想通过说差异是 DATE_CREATED 来防止这种情况发生并不意味着数据是脏的。我只需要知道该怎么做。

标签: java database performance hibernate flush


【解决方案1】:

好吧,除非你使用StatelessSession,否则你真的无法避免在hibernate 中进行脏检查。当然,您会因此失去很多功能(延迟加载等),但这取决于您做出决定。

另一种选择:我肯定会尝试在您的实体中使用 dynamic-update=true。喜欢:

@Entity(dynamicUpdate = true)
class MyClass

使用它,Hibernate 将仅更新已修改的列。在具有少量列的小表中,它不是那么有效,但在您的情况下,它可能有助于加快整个过程,因为您无法避免使用常规 Hibernate 会话进行脏检查。更新几列而不是整个对象总是更好,对吧? This post 更多地谈论动态更新属性。

【讨论】:

  • 这听起来至少可以解决性能问题。我也会研究 StatelessSession,因为我不认为延迟加载是用户不能没有的东西。谢谢您的帮助。如果您有其他想法,请发布。
  • 是的。看一看。关于 StatelessSession,我并不是说你必须在任何地方都使用它。就在你需要使用批处理的地方,就像上面那种情况一样。 ;)
【解决方案2】:

我想知道是否有其他方法可以防止这种情况发生 大量提交数据或排除该特定列的方式 从“检查”休眠中,我不必提交所有 25 个项目 如果我只对 1 进行了更改?

我会分析应用程序以确保刷新时的脏检查实际上是问题所在。如果您发现确实是这种情况,您可以使用 evict 来管理会话大小。

session.update(myObject);
session.flush();
session.evict(myObject);

【讨论】:

    猜你喜欢
    • 2011-03-17
    • 2011-03-14
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多