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

标签 java postgresql jpa server-side genetic-algorithm

我需要帮助来优化我的服务器端 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/

相关文章:

java - 同时保留两个实体

java - 使用 Scala Trait 扩展 Java 类

java - 持久对象异常 : detached entity passed to persist

java - 未获取结果集中的所有行

sql - 将点连接到一个点

postgresql - salt : execute custom SQL after creating a postgres user

java - 对象创建过程中究竟发生了什么? ( java )

sql - 如何按不间断序列对条目进行分组?

java - 使用 EclipseLink JPA 绑定(bind)大于 255 个字符的字符串

java - JMS队列: Re-inserting a message vs Rolling Back