首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么默认关闭hibernate batching / order_inserts / order_updates?

为什么默认关闭hibernate batching / order_inserts / order_updates?
EN

Stack Overflow用户
提问于 2015-01-03 21:38:17
回答 2查看 17.5K关注 0票数 24

默认关闭hibernate batching / hibernate.order_updates / hibernate.order_inserts有什么原因吗?当您启用批处理大小为50时,是否有任何缺点?order_updates / order_inserts参数也是如此。是否存在不应该启用此功能的用例?使用此功能时是否会对性能产生影响?

我只能看到,当我需要减少查询计数时,这些设置有很大帮助,特别是在我的应用程序和数据库服务器之间具有高延迟的云环境中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-03 23:40:29

通常,将batch size设置为合理大小并将order_insertorder_updates设置为true可以显著提高性能。

在我的所有项目中,我都使用这个配置作为基础:

代码语言:javascript
复制
hibernate.jdbc.batch_size = 100
hibernate.order_inserts   = true 
hibernate.order_updates   = true
hibernate.jdbc.fetch_size = 400

但是,是的,-在使用批处理时可能会有memory impact。但这取决于jdbc驱动程序。

例如,Oracle JDBC driver为每个PreparedStatement创建内部缓冲区并重用这些缓冲区。如果调用简单update语句,则使用ps.setInt(1, ...)ps.setString(2, ...)等设置一些参数,然后Oracle将这些值转换为一些字节表示形式,并将其存储在与此PreparedStatement和连接相关的缓冲区中。

但是,当您的PreparedStatement使用大小为100的批处理时,此缓冲区将大100倍。如果你有一些连接池,用于exapmle 50个连接,那么可能有50个这样大的缓冲区。而且,如果您有100个不同的语句使用批处理,那么所有此类缓冲区都会对内存产生重大影响。当您启用批处理大小时,它将成为全局设置- Hibernate将在所有插入/更新中使用它。

然而,我发现在我的所有项目中,性能提升比内存影响更重要,这就是为什么我使用batchsize=100作为默认设置。

对于order_insertsorder_updates,我认为默认情况下这些设置是禁用的,因为这些设置只有在批处理打开时才有意义。在启动批处理的情况下,这些排序是简单的开销。

您可以在Oracle的白皮书中找到更多信息:

http://www.oracle.com/technetwork/topics/memory.pdf

在“语句批处理和内存使用”部分。

====编辑2016.05.31 ====

简单介绍一下order_insertsorder_udpates属性。假设我们有实体AB和persist 6对象:

代码语言:javascript
复制
session.save(A1);  // added to action queue
session.save(B1);  // added to action queue
session.save(A2);  // ...
session.save(B2);  // ...
session.save(A3);  // ...
session.save(B3);  // ...

在上面的执行之后:

  • 这6个对象具有生成的标识符
  • 这6个对象连接到session (StatefulPersistenceContext: entitiesByKey,entityEntries等/Hib.v3/)
  • 这6个对象按相同的顺序添加到ActionQueue : A1,B1,A2,B2,A3,B3

现在,考虑两种情况:

案例1: order_inserts = false

在刷新阶段,hibernate执行6 insert语句:

代码语言:javascript
复制
ActionQueue = [A1, B1, A2, B2, A3, B3]
insert into A - (A1)
insert into B - (B1)
insert into A - (A2)
insert into B - (B2)
insert into A - (A3)
insert into B - (B3)

案例2: order_inserts = true,允许批处理

现在,在刷新阶段,hibernate执行2批插入语句:

代码语言:javascript
复制
ActionQueue = [A1, A2, A3, B1, B2, B3]
insert into A -  (A1, A2, A3)
insert into B -  (B1, B2, B3)

我为Hibernate v3研究了这一点,我认为Hibernate v4以同样的方式使用ActionQueue。

票数 46
EN

Stack Overflow用户

发布于 2016-11-03 04:01:09

这里的文档:https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/chapters/batch/Batching.html

表示使用这些属性可能会有性能损失。我假设这就是它们没有默认设置的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27755461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档