当前位置: 首页 > 知识库问答 >
问题:

Hibernate批更新vs存储过程

桑坚成
2023-03-14

我们有大约100000条记录要插入数据库。在Hibernate批插入中执行此操作是一个好主意吗?选择批量大小的策略应该是什么?

或者我们应该为批量插入调用存储过程?无法获取有关将对象数组从Hibernate传递到DB存储过程的任何信息。

或者两者的混合搭配会加快这一过程。比如批量调用存储过程?

共有1个答案

窦伟
2023-03-14

要高效地进行批插入,请确保启用以下属性:

<property name="hibernate.order_updates" value="true"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.jdbc.batch_versioned_data" value="true"/>
<property name="hibernate.jdbc.batch_size" value="50"/>

还要确保您的实体@Id列不使用标识。标识生成器禁用了批处理。

我建议您尝试增强的生成器,尤其是池lo优化器,以防您使用支持序列的DB(Oracle、PostgreSQL、SQL Server 2008)。

您可以从Hibernate调用存储过程,但它对于选择数据比批量插入更有用。

如果建议的Hibernate批处理支持还不够,您可能应该尝试使用本机存储过程。

您选择的任何方法都需要了解长时间运行的事务。长时间运行的事务持有锁,撤消/重做数据库日志可能会增加并使您的事务变得更慢。

 类似资料:
  • 分隔符$$CREATE PROCEDURE

  • 我有一个简单的存储过程,在我创建的表上执行。当我使用硬编码参数单独执行update语句时,它可以工作,但过程在执行时不会更新。它返回一个“命令已成功完成”,但不影响任何行。我检查了数据,数据也没有变化。

  • 我可以在Oracle中通过ODBC执行一批存储过程吗?存储过程具有我使用参数标记绑定的输入参数。 在SQLServer中,我有这个功能,在DB2中,我只能进行批处理插入/更新,但我不能从ODBC/C代码批处理存储过程。 Oracle似乎支持插入语句的批处理,如果使用JDBC,也可以批处理存储过程。 是否可以做同样的事情,但使用对存储过程和ODBC的调用? 谢谢

  • 在我的grails应用程序中,我们调用的存储过程可能会更新数千条记录。在存储过程调用之后,我需要以json格式将其中许多记录发送回UI。但是,hibernate会在存储过程完成后继续查看旧对象。我在这些对象中的每一个上都尝试了execute(),并使用HQL再次加载了它们,但没有任何效果。 解决这个问题的最佳方法是什么。

  • 我正在使用Hibernate Envers进行审计。后期更新和后期插入工作正常。 我有一个要求,即我只需要审核审核表中更新的列(例如employee_aud)。默认情况下,envers会将整个持久化实体插入到审计表中。 我只需要插入已更新的值。 有没有可能这样做? 提前谢谢。 干杯

  • 我有一个批处理过程,它正在为一组实体重新计算数据。通过Hibernate从DB获取实体列表: 当流程运行时,某些实体似乎正在分离,导致两种症状: 当尝试获取惰性数据时,我得到一个异常: 在我的第一次尝试中,我试图通过调用inside