【问题标题】:JPA query optimization used in multiple iterations function多迭代函数中使用的 JPA 查询优化
【发布时间】:2016-08-10 08:41:33
【问题描述】:

我需要帮助来优化我的服务器端 Java 程序的一部分。我会尽量简化解释。

我有一个需要最大化 A、B、C 三个对象的函数的 Java 服务器。我总是找到三个中最不合适的一个,然后用数据库中的另一个随机替换它。

大约 100 次迭代大约需要 2.5 秒,而 250 次我已​​经达到 9 秒。

我试图找出花费最多时间的内容,但我在 JPA 查询上损失了大约 70% 的时间。我认为问题在于我执行查询以获取每次迭代的随机新对象。

Query q = em.createQuery("SELECT object FROM Obj o WHERE .... ORDER BY random()");

设置参数

q.setFirstResult(0)
q.setMaxResults(1)
List<Obj> myMcb = q.getResultList();

其中 Obj 可以是 A、B 或 C。每种类型在 Postgres DB 中都有自己的表。

从单个查询中获取大量数据然后在 Java 列表中进行“搜索”的解决方案是否可行? 有没有办法利用 JPA 中的缓存或 Java 中的多线程? 关于我的方法还有其他想法吗?这是一种即兴创作,是我第一次实现这样的东西。

【问题讨论】:

  • Select * 从返回多少行?考虑使用原生查询来返回单行吗?
  • 从什么时候开始“随机”成为 JPQL 函数?提示:不是
  • @farrellmr 我认为数据库中会有几千个对象。今晚我会尝试做一个原生查询,看看性能会提高多少。
  • 启用日志记录并首先检查底层查询 - 如果它使用 LIMIT 1 那么这就是您将在本机查询中使用的内容。如果没有,那就写本机。还要考虑 setFetchSize

标签: java postgresql jpa server-side genetic-algorithm


【解决方案1】:

我会尝试猜测一个 id。

将您的选择语句更改为

SELECT object FROM Obj o WHERE id = random(select max(id) from obj)

这不能找到对象,但它可以而且会更快。 这里解释了正确的随机函数:http://www.techonthenet.com/postgresql/functions/random.php

当然,您可以使用 Obj 中的所有现有 ID 创建一个 List 和 随机挑选一个接一个供您查询。如果 ID 的数量足够小以将所有 ID 保存在内存中,这将起作用。你可以很容易地估计这个 每个 ID 计算四个字节时。

java.util.List<Integer> idList = em.createQuery("SELECT id FROM Obj).getResultList();
java.util.Collections.shuffle(idList)

【讨论】:

  • 关于 random() 的真正有趣的东西。但是,我不能在 0 和 max(id) 之间随机选择,因为在 WHERE 内部我有几个约束。因此,并非每个 Obj 都是可行的候选者。
猜你喜欢
  • 2016-10-05
  • 2012-05-18
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2018-09-23
  • 2012-07-11
相关资源
最近更新 更多