【问题标题】:Understanding @BatchSize in Hibernate了解 Hibernate 中的 @BatchSize
【发布时间】:2014-10-02 08:57:28
【问题描述】:

Hibernate documentation 在@BatchSize 处提供了一些信息:

@BatchSize 指定用于获取此实例的“批量大小” 按标识符分类。尚未加载的实例以批量加载 一个时间(默认 1)。

我不清楚这个注释的目的是什么,当我们需要使用它时。能否请一些人帮助我了解何时使用此注释。

【问题讨论】:

    标签: java hibernate


    【解决方案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。

    【讨论】:

    • hibernate 怎么知道我要在所有的猫上调用 getOwner,而只是在循环的第一次迭代中?另外,它怎么知道我会调用哪个?它是否只是假设,由于实体管理器正在监视您的 25 个,您可能想要全部加载它们?
    • @Ploni 当您第一次使用惰性关系的 getter 时,hibernate 会在会话中查找相同类型的其他对象。假设您输入了N 的批量大小。然后,对于每个N 父实体,使用IN (:parentIds) 子句执行获取子实体的查询。如果你想使用这种行为,你的查询必须在事务中执行。
    【解决方案2】:

    @BatchSize 将根据您的大小从数据库中获取记录。假设您的结果中有 100 条记录,如果您将批量大小定义为 10,那么每个 db 调用将获取 10 条记录。从逻辑上讲,它会提高性能。

    【讨论】:

    • 感谢您的回复,如果我看到我的帖子中的声明,我明白如果我通过标识符(或 ID)获取记录,那么这意味着我只会从数据库中获得 1 条记录,那么如何BatchSize 在这种情况下有帮助吗?还有Not yet loaded instances are loaded batch-size at a time (default 1).是什么意思?你能澄清一下吗?
    • 那个时候你也可能有更多的子记录。它将根据批量大小获取子记录。
    • 你可以通过stackoverflow.com/questions/6687422/…得到更好的理解
    • @Aun 您链接的问题是针对hibernate.jdbc.batch_size。这与@BatchSize 完全不同。一是针对insert/update优化,二是针对select优化。
    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 2011-06-13
    • 2023-04-08
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    相关资源
    最近更新 更多