多次迭代函数中使用的 JPA 查询优化

JPA query optimization used in multiple iterations function

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

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

对于大约 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 数据库中都有自己的 table。

从单个查询中获取大量数据然后将 "search" 放入 Java 列表中的解决方案是否可行? 有没有办法在 JPA 中使用缓存或在 Java 中使用多线程? 关于我的方法还有其他想法吗?这有点即兴,是我第一次实现这样的东西。

我会试着猜一个id。

将您的 select 语句更改为

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

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

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

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