【发布时间】:2014-10-02 08:57:28
【问题描述】:
Hibernate documentation 在@BatchSize 处提供了一些信息:
@BatchSize 指定用于获取此实例的“批量大小” 按标识符分类。尚未加载的实例以批量加载 一个时间(默认 1)。
我不清楚这个注释的目的是什么,当我们需要使用它时。能否请一些人帮助我了解何时使用此注释。
【问题讨论】:
Hibernate documentation 在@BatchSize 处提供了一些信息:
@BatchSize 指定用于获取此实例的“批量大小” 按标识符分类。尚未加载的实例以批量加载 一个时间(默认 1)。
我不清楚这个注释的目的是什么,当我们需要使用它时。能否请一些人帮助我了解何时使用此注释。
【问题讨论】:
使用批量获取,如果访问一个代理,Hibernate 可以加载多个未初始化的代理。批量抓取是对惰性选择抓取策略的优化。您可以通过两种方式配置批量获取:在类级别和集合级别。
类/实体的批量获取更容易理解。考虑以下示例:在运行时,您在 Session 中加载了 25 个 Cat 实例,每个 Cat 都有对其所有者的引用,即 Person。 Person 类使用代理lazy="true" 进行映射。如果您现在遍历所有猫并在每个猫上调用 getOwner(),默认情况下,Hibernate 将执行 25 个 SELECT 语句来检索代理的所有者。您可以通过在 Person 的映射中指定批量大小来调整此行为:
<class name="Person" batch-size="10">...</class>
Hibernate 现在将只执行三个查询:模式是 10、10、5。
【讨论】:
N 的批量大小。然后,对于每个N 父实体,使用IN (:parentIds) 子句执行获取子实体的查询。如果你想使用这种行为,你的查询必须在事务中执行。
@BatchSize 将根据您的大小从数据库中获取记录。假设您的结果中有 100 条记录,如果您将批量大小定义为 10,那么每个 db 调用将获取 10 条记录。从逻辑上讲,它会提高性能。
【讨论】:
Not yet loaded instances are loaded batch-size at a time (default 1).是什么意思?你能澄清一下吗?
hibernate.jdbc.batch_size。这与@BatchSize 完全不同。一是针对insert/update优化,二是针对select优化。