如何加快JPA中的列表访问速度

时间:2014-07-28 01:16:50

标签: java spring oracle jpa

在我的mapper类中,我总是要从公司实体中检索部门列表:

  @OneToMany(mappedBy = "company", orphanRemoval = true, cascade = CascadeType.ALL)
  public List<CompanyDepartments> getDepartments()
  {
    return departments; //java.util.List variable. 
  }

有几千个部门(约2000多个)。我正在努力减少获取公司数据所需的时间,并希望从那些本质上相当静态的部门开始。

选项1:我总是可以在映射器中有一个私有方法,它在第一次加载时填充缓存并始终从缓存中返回。

但有更简单的事情吗?我可能不是第一个面对这个并想知道如何处理这个问题的人。是否有可以使用的已知注释。就像实体中变量的@Singleton注释一样? (显然没有这样的注释)。使这个列表成为单例的最简单方法是什么。

使用spring数据jpa进行db交互的典型spring mvc 3应用程序。

2 个答案:

答案 0 :(得分:1)

我建议这个链接解决n + 1查询问题... How can i resolve the N+1 Selects problem?

此外,你可以在你的搜索服务上放一个缓存(lvl 2), 如果数据在应用程序的生命周期内没有改变。 http://docs.spring.io/spring/docs/3.1.0.M1/spring-framework-reference/html/cache.html

另一种方法是在db上添加索引。

我希望我已经向你提供了有关你问题的所有答案。

答案 1 :(得分:1)

您遇到的是“对象 - 关系阻抗不匹配”的一部分。一种解决方案是扩展您的对象模型,以便您可以使用左连接提取来仅使用一个SQL语句加载多个公司,包括其部门。

使用此技术的问题是您一次只能填充一个列表。虽然它很好而且很容易在对象世界中定义许多子列表,很难从关系数据库同时加载所有这些列表(并因此有效地加载)。但是,可以使用对象或XMLType查询在Oracle上完成。

从RDBMS中获取此类数据的直接方法是编写完全匹配手头任务的自定义查询,并仅提供实际需要的数据。 因此,您不仅需要一个公司课程,还需要很多 - 每个任务一个。 - 您实际上是继承而不是归因

顺便说一句,这就是为什么ORM仍然被认为是Vietnam of Computer science的原因 - 很容易上手,但很难成功。