我已经使用 Union Platform 作为基于 Java 的游戏服务器实现了 JOOQ,并使用 Union Platform 的 Orbiter Micro(Union JS 客户端)在浏览器上运行它。
但是,对于30-40个活跃玩家的小规模赛事,联盟平台在速度上显得有些滞后。
对于每个游戏实例(即每个房间),我都配置了一个执行所有查询的工厂连接。它的作用是,
对于每个玩家的回合,
- 播放器可以输入一个整数,在一系列(4 个查询)条件检查之后,它通过 JOOQ 插入/更新数据库
- 然后为了取回整数的状态,它再次执行 3 个查询,这些查询有效地转换为 3 个链接的 HashMap 以更新游戏状态。
现在,响应花费了如此多的时间,以至于玩家看到了性能问题。而 Union Platform 实际上声称可以轻松处理超过 1000 个活跃玩家的实例。所以这实际上意味着我的 JOOQ 查询中存在一些错误(我确实使用了很多 LEFT OUTER JOIN)。
因此非常欢迎任何提高吞吐量和分析每个查询的建议。
最佳答案
对我来说,这听起来像是正常的 SQL 调优问题(或者可能是几个不同的问题)。鉴于 jOOQ 允许您执行实际的 SQL,并且在没有正确的索引和约束的情况下使用 OUTER JOIN
时会出现很多错误,问题很可能出在 SQL 本身。当您打开调试/跟踪日志记录时,jOOQ 将打印出几条信息到日志输出,包括
调试级别
- SQL语句
- 结果的前5条记录
- 语句执行时间(该行为已在 jOOQ 3.10 中删除,请参阅 https://github.com/jOOQ/jOOQ/issues/8786)
微量水平
- 与 DEBUG 级别相同
- 声明准备时间
- 绑定(bind)值
- 声明绑定(bind)时间
如果你输入 log4j 就可以了或 slf4j在你的类路径上和 jOOQ 一起。此 blog post 中记录了更多详细信息
这是一个开始。您还可以使用类似 Yourkit Profiler 的工具或 JProfiler .显然,您应该考虑您的 Postgres 执行计划。在 Postgres documentation 中有一些关于此的指示。 .
关于java - 我们如何分析 JOOQ 语句的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8561317/