gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:57:44 26 4
gpt4 key购买 nike

我需要帮助来优化我的服务器端 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 数据库中都有自己的表。

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

最佳答案

我会尝试猜测一个 ID。

将您的选择语句更改为

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)

关于java - 多次迭代函数中使用的 JPA 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38868285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com