0

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

例如,执行如下简单的 JPA 查询:

 SELECT p FROM Picklist p;

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

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

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

4

2 回答 2

1

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

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

了解如何优化关系

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

于 2012-05-09T14:44:47.737 回答
1

首先你需要检查 JPA Query

SELECT Picklist p FROM Picklist p; 

这应该是

SELECT p FROM Picklist p; 

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

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

于 2012-05-09T14:21:59.013 回答