如何优化 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_datahibernate.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 序列,例如seq_mytable_id 那些需要 hibernate.jdbc.use_get_generated_keys 吗? 为什么我需要 hibernate.order_inserts? “那些需要hibernate.jdbc.use_get_generated_keys吗?”不,他们不需要,因为在发出insert语句之前从序列中获取了id。_“为什么要我需要hibernate.order_inserts?”_关于这个和类似的标志,请阅读我在答案中链接到的博客。

以上是关于如何优化 Oracle 11g 和 Hibernate 的批量插入?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 11g 透视查询优化 - 多行到单行

oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)

Oracle11g常用数据字典(转)

如何查看 oracle weblogic server11g集群连接池最大容量

oracle11g自动维护任务

Oracle 11g 新特性 -- SQL Plan Management 说明