【问题标题】:Faster: Iterate list or JPQL query?更快:迭代列表或 JPQL 查询?
【发布时间】:2012-11-08 17:20:46
【问题描述】:

什么会更快找到匹配项:迭代列表或执行 JPQL 查询?当然,平均而言,因为这也取决于匹配项在列表中的位置。答案是否取决于列表大小?

示例:查找名称为“Joe”(唯一名称)的人

JPQL:

TypedQuery<Person> q = em.createQuery(  "SELECT p " +
                                        "FROM Person p " +
                                        "WHERE p.name = :name ", Person.class);
q.setParameter("name", "Joe");
return q.getResultList().size() == 1;

迭代:

for (Person p : persons) {
    if ("Joe".equals(p.name)) {
        return true;
    }
}
return false;

【问题讨论】:

  • (p.name == "Joe") 看起来很可疑。你的意思是(p.name.equals("Joe")),然后还是("Joe".equals(p.name)) 更好?
  • 是的,这样会更好。我会改变它。但这并没有改变我的问题。

标签: performance jpql loops


【解决方案1】:

在 Java 或 DB 中查找特定人员是否会更快,这实际上取决于您的具体情况,如果您在此处遇到性能问题,您真的应该为这两种实现计时。

有很多事情需要考虑。一个重要的问题是,persons 在您的迭代示例中来自哪里?您是否已经准备好人员名单,或者您是否必须在此之前 SELECT 数据库中的所有人员?如果您无论如何都要查询Person 表,那么可能 最好只使用那个简单的where 子句。

此外,如果结果很多,结果的数量可能很重要。如果您的数据库中只有 5 个人,那么实现速度的任何差异都可能非常小,您不会注意到。如果你有几百万,那么这些差异就会被放大。

我的直觉是,无论哪种方式,它对您的情况可能都没有显着影响,您应该使用您觉得更舒服的那个。如果这确实是一个性能瓶颈,那么您需要在开始担心摆弄表、索引、线程等之前对它们进行计时。

【讨论】:

  • 谢谢。性能还不是真正的问题。 “人”来自延迟加载的一对多关系。
猜你喜欢
  • 2014-10-06
  • 2011-09-22
  • 1970-01-01
  • 2021-08-22
  • 2013-02-03
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多