【发布时间】: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