当前位置: 首页 > 面试题库 >

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

闻人献
2023-03-14
问题内容

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

public class Product {


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

}

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


问题答案:

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

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

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

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

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



 类似资料:
  • hibernate的@BatchSize注释允许批量获取延迟加载的实体。例如,如果我有类似的东西: 现在,如果我得到一个产品的类别,Hibernate将获取多达10个处于当前会话中且尚未初始化其类别字段的产品的类别。这节省了大量对数据库的SQL调用。到目前为止还不错。现在我想知道为什么我不会在每个延迟加载关系上使用@BatchSize注释?毕竟,我为什么要对数据库进行额外的调用?这显然是有原因的,

  • 我知道什么是DTO:一个在进程之间传输数据以减少方法调用数量的对象。我知道什么是hibernate中的延迟加载。 我在《JHipster的全栈开发》一书中读到这样一句话:JHipster在服务器端使用DTO(数据传输对象)和VM(视图模型)。DTO用于将数据从服务层传输到资源层。它们打破了Hibernate事务,避免了资源层触发进一步的延迟加载。 我不明白DTO和延迟加载之间的关系。

  • 1、mybatis 是否支持延迟加载? 延迟加载其实就是讲数据加载时机推迟,比如推迟嵌套查询的时机。 延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,一定程度上提高了效率。 mybatis仅支持关联对象association和关联集合对象collection的延迟加载,association是一对一,collection是一对多查询,在mybatis配置文件中可以配置lazylo

  • 问题内容: 什么是Java的延迟加载?我不明白这个过程。有人可以帮助我了解延迟加载的过程吗? 问题答案: 假设您有一个父母,而那个父母有很多孩子。Hibernate现在可以“延迟加载”子级,这意味着它在加载父级时实际上并不会加载所有子级。而是在要求时加载它们。您可以显式地请求此请求,或者,更常见的是,当您尝试访问孩子时,hibernate会自动加载它们。 延迟加载可以帮助显着提高性能,因为通常您不

  • 问题内容: Java中的延迟加载是什么?我不明白这个过程。有人可以帮助我了解延迟加载的过程吗? 问题答案: 假设你有一个父母,而那个父母有很多孩子。Hibernate现在可以“延迟加载”子级,这意味着在加载父级时,它实际上并未加载所有子级。而是在要求时加载它们。你可以显式地请求此请求,也可以是更常见的情况,当你尝试访问孩子时,hibernate会自动加载它们。 延迟加载可以帮助显着提高性能,因为通

  • 问题内容: 当我做 我看到两个查询被解雇了。一个用于获取人员数据,另一个用于人员详细数据。 根据我的理解,应该仅触发1个查询来获取人数据而不是人详细数据,因为我已经提到了延迟加载。为什么personDetail数据与person数据一起获取? 问题答案: Hibernate无法像代理关系中的Sets / Lists一样代理自己的对象,因此延迟加载不起作用。 我认为此链接可能有助于理解您的问题:ht