12

hibernate 的 @BatchSize 注释允许批量获取延迟加载的实体。例如,如果我得到类似的东西:

public class Product {


    @OneToMany(fetchType=LAZY)
    @BatchSize(size=10)
    private ProductCategory category;

}

现在,如果我得到一个产品的类别,Hibernate 将获取多达十个产品的类别,这些产品在当前会话中并且尚未初始化其类别字段。这节省了大量对数据库的 SQL 调用。到目前为止,一切都很好。现在我想知道为什么我不在每个延迟加载的关系上使用 @BatchSize 注释?毕竟我为什么要额外调用数据库?这显然是有原因的,否则 Hibernate 的人可能会将其设为默认值,但我目前看不到它。

4

2 回答 2

19

我不会直接回答你的问题,但我会回答一个更通用的问题,可能是“我发现了一些对我来说更快的东西,为什么不把它应用到任何地方?”

简短的回答是:您不应该进行抢先优化。

hibernate 是一个很棒的 ORM,它允许各种优化。您应该测量导致问题的所有过程(经典的N+1,即使它很快,任何缓慢的过程等)并优化以解决它。

通过急切加载某些属性可能会获得更好的性能,因为您总是使用它们,您可能需要BatchSize100 来获取其他属性,因为您知道它与该属性的关系数有关。

最终,除非您需要关心优化,否则您不应该关心优化。当您完成测量并发现问题时,您需要小心。

于 2013-07-12T12:18:19.573 回答
9

为什么我不在每个延迟加载的关系上使用 @BatchSize 注释?

因为它是一种优化,您可能不需要在每种情况下。当您的应用程序要访问product.category许多不同的时,像这样的批量获取很有用products,因此您可以select from category...执行单个查询而不是 N 个查询。

但是,如果您的应用程序访问product.category一个Product实例时,不太可能访问同一会话category中其他实例的字段怎么办?Product如果您@BatchSize启用了该关联,那么您只是将一些其他Category实例加载到会话中而没有任何收获——它们永远不会被使用。

于 2013-07-12T13:19:09.150 回答