为什么休眠批处理/order_inserts/order_updates默认处于禁用状态?

2022-09-01 15:30:24

默认情况下禁用休眠批处理/hibernate.order_updates/hibernate.order_inserts有什么原因吗?启用批大小为 50 时是否有任何缺点?order_updates/order_inserts参数相同。是否存在不应启用此功能的用例?使用此功能时是否有任何性能影响?

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


答案 1

通常设置为可谐振的大小和 ,可以显著提高性能。batch sizeorder_insertorder_updatestrue

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

hibernate.jdbc.batch_size = 100
hibernate.order_inserts   = true 
hibernate.order_updates   = true
hibernate.jdbc.fetch_size = 400

但是,是的 - 使用批处理时可能会对内存产生影响。但这取决于jdbc驱动程序。

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

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

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

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

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

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

“语句批处理和内存使用”一节中。

==== 编辑 2016.05.31 ====

关于和财产的一句话。假设我们有实体,并以这种方式持久化6个对象:order_insertsorder_udpatesAB

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 个对象连接到会话 (StatefulPersistenceContext: entitiesByKey, entityEntries, etc. /Hib.v3/)
  • 以下 6 个对象按相同的顺序添加到操作队列中:[A1、B1、A2、B2、A3、B3]

现在,考虑2种情况:

案例1: order_inserts = false

在刷新阶段休眠期间,执行 6 个插入语句:

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

现在,在刷新阶段休眠期间,休眠执行 2 个批处理插入语句:

ActionQueue = [A1, A2, A3, B1, B2, B3]
insert into A -  (A1, A2, A3)
insert into B -  (B1, B2, B3)

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


答案 2

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

表示使用这些属性可能会降低性能。我认为这是默认情况下不设置它们的原因。


推荐