如何优化 Oracle 11g 和 Hibernate 的批量插入?
Posted
技术标签:
【中文标题】如何优化 Oracle 11g 和 Hibernate 的批量插入?【英文标题】:How do I optimize batch INSERTs for Oracle 11g and Hibernate? 【发布时间】:2016-03-28 02:26:08 【问题描述】:我有一个执行相当多的批量插入的应用程序。我想优化应用程序以尽可能快地完成这些工作。
我看到几个我认为与批量插入有关的休眠设置:
hibernate.jdbc.batch_size
hibernate.jdbc.batch_versioned_data
hibernate.jdbc.use_get_generated_keys
我不确定是否需要设置这些属性。如果我确实需要设置它们,我不确定正确的值是什么。
对于我的 Oracle 版本,将 hibernate.jdbc.batch_versioned_data
和 hibernate.jdbc.use_get_generated_keys
设置为 true
是否安全?
如何选择批量大小?
我正在使用这些库的以下版本:
休眠: 3.2.3 GA Oracle 数据库: 11G Oracle 数据库驱动程序: 11.2.0.3.0 c3p0: 0.9.1.2【问题讨论】:
【参考方案1】:hibernate.jdbc.batch_size
这应该设置为适合您要求的合理值(建议在 5 到 30 之间)。
hibernate.jdbc.batch_versioned_data
这对于您的数据库和 JDBC 驱动程序版本不安全(有关详细信息,请参阅this question)。请勿不开启此功能。否则,对于版本化实体,乐观锁定机制将被静默破坏。
hibernate.jdbc.use_get_generated_keys
这由一些 Hibernate id 生成器使用,它们在插入后检索本机生成的键(当自动递增列和类似的列用于主键生成时)。如果您使用此类 id 生成器,无论是否使用批处理,都必须启用它。
另外,请确保启用hibernate.order_inserts
。有关此标志和 Hibernate 批处理的更多详细信息,请参阅 here。
【讨论】:
谢谢!我对大多数 ID 使用 Oracle 序列,例如hibernate.jdbc.use_get_generated_keys
吗?”不,他们不需要,因为在发出insert
语句之前从序列中获取了id。_“为什么要我需要hibernate.order_inserts
?”_关于这个和类似的标志,请阅读我在答案中链接到的博客。以上是关于如何优化 Oracle 11g 和 Hibernate 的批量插入?的主要内容,如果未能解决你的问题,请参考以下文章
oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)