一尘不染

为什么我不对每个延迟加载的关系都使用@BatchSize?

hibernate

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

public class Product {


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

}

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


阅读 173

收藏
2020-06-20

共1个答案

一尘不染

我不会直接回答您的问题,而是会回答一个更笼统的问题,可能是“我发现了一些对我更快的方法,为什么不将其应用于所有地方?”

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

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

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

最终,除非您 需要 进行优化,否则您不应该在乎优化。完成测量并发现问题后,您需要注意。

2020-06-20