【问题标题】:Hibernate : dynamic-update dynamic-insert - Performance EffectsHibernate : 动态更新动态插入 - 性能效果
【发布时间】:2011-03-25 04:40:21
【问题描述】:

使用 dynamic-update 或 dynamic-insert 有积极的作用,但通常只对性能有轻微影响,http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/ 也提到过

但是参考文档提到这可能会产生负面的性能影响,如下面http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-class 所述:

虽然这些设置可以增加 在某些情况下,他们可以 实际上会降低性能 其他人。

任何人都可以提出一些例子/场景来提及相同的负面性能影响吗?

【问题讨论】:

  • 如果您只编写 JPQL 或仅更新这些列的 CriteriaQuery,JPA 会做您想做的事情。

标签: java performance hibernate orm


【解决方案1】:

Hibernate 为 每个 实体缓存实际的 INSERT/SELECT/UPDATE SQL 字符串,明显的好处是当您想要持久化、查找或更新实体时它不必计算 SQL .

但是,当使用动态插入或动态更新时,Hibernate 每次都必须生成相应的 SQL 字符串,因此在 Hibernate 方面存在性能成本。

换句话说,在数据库端和 Hibernate 端的开销之间进行权衡。

我的观点是动态插入和动态更新对于具有胖 blob 列的表或具有大量列的表可能很有趣。在其他情况下,我不相信动态插入或更新总是意味着性能提升(我默认不使用它们)。但与往常一样,您应该测量它。

另见

【讨论】:

  • “具有大量列的表”——对您来说,什么是大量列? 10、100、1000?
  • Integer.MAX_VALUE 是一个巨大的数字。
【解决方案2】:

我认为许多索引也会减慢更新和插入的速度,因此,除了大列之外,动态更新应该适用于每行具有很大宽度/内容和许多索引的表。你知道,在“现实生活”中,数据库并不总是带有小型规范化表......

在大型表上重建索引可能比创建和解析 SQL 查询的开销要长得多。

【讨论】:

    【解决方案3】:

    另一个原因是在更新以前分离的对象时。为此,首先需要从数据库中获取记录,因为分离的对象不在会话缓存中。因此,在这种情况下,动态更新需要额外的往返行程来执行初始获取。

    【讨论】:

      【解决方案4】:

      对于小表动态不是好方法,因为您必须浪费时间执行额外的步骤来判断应该更新和插入哪一列。对于大表,它在流量和 sql 命令执行速度方面都具有巨大的性能,因为要获取、查询和传输的数据要少得多。

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 2018-07-06
      相关资源
      最近更新 更多