【问题标题】:JPA query "optimization"JPA 查询“优化”
【发布时间】:2012-05-18 01:20:51
【问题描述】:

我刚刚在 JPA (EclipseLink) 的数据库中打开了查询日志记录,并亲眼目睹了 JPA“优化”和“缓存”的恐怖。

例如,像这样做一个简单的 JPA 查询:

 SELECT p FROM Picklist p;

... 将导致 JPA 对数据库执行一百万次 SQL 查询(每条记录一个查询,因此从 id=[...] 的选项列表中选择 *)。而且 Picklist 是一个简单的实体!

为什么它不执行 SELECT * FROM Picklist 而只是在内存中执行其他所有操作(填充持久性上下文或其他)?

是否需要一些特殊的开关来告诉它这样做?为什么会这样?

【问题讨论】:

  • 为什么不是 SELECT p FROM Picklist p; ?没有(选择列表 p)

标签: jpa ejb eclipselink


【解决方案1】:

JPA 提供了许多不同的查询优化技术,但如果您不使用其中任何一种,可能会导致不必要的查询。

我假设您正在查看 Picklist 关系的查询,尽管您使用的确切查询、Picklist 的映射和 SQL 会有所帮助。

了解如何优化关系

看, http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html

【讨论】:

  • 例如,我有一个客户,它有几个字段,它们是 Picklist 实体,即用于 customerType 和 IndustryType。现在我调用 5 次 daoPicklist.getByName("partner") 并获得一个 Picklist 并将其分配给现有的 Customer 实体并合并它。这个 daoPicklist.getByName(...) 在(不同模块的)代码中被多次调用来检索 Picklist。但是当我查看数据库查询日志时发生的情况是,每次调用此方法时,都会执行 SQL 查询!所以根本没有缓存。
  • daoPicklist.getByName(...) 是做什么的?如果它不是按 Id 执行查询,那么它将始终访问数据库,除非您启用查询缓存。
【解决方案2】:

首先你需要检查 JPA Query

SELECT Picklist p FROM Picklist p; 

这应该是

SELECT p FROM Picklist p; 

其次,您需要了解您不能创建Select *,因为当您执行该类型的查询时,您会带来更多信息,而不仅仅是列。

第三请记住,Hibernate 需要将查询翻译到每个数据库,以提供该功能,因为它是 Sql Native,因此可能会降低一些性能,因为每个新版本都会对此进行改进,并且如果您需要极高的性能。使用您完全可以使用和处理记录的普通 Sql 查询

【讨论】:

    猜你喜欢
    • 2016-10-05
    • 2018-09-23
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2010-09-29
    相关资源
    最近更新 更多