2

对于我正在开发的多人游戏,我想在不阻塞游戏更新线程的情况下将事件记录到 mysql 数据库中,这样如果数据库繁忙或表被锁定,游戏在等待时不会停止运行写。

实现这一目标的最佳方法是什么?

我正在使用 c3p0 来管理数据库连接池。到目前为止,我最好的想法是将查询更新字符串添加到同步列表中,其中一个独立线程每 100 毫秒检查一次列表并执行它在那里找到的查询。

4

3 回答 3

2

将更新放在BlockingQueue. 有一个单独的线程在队列上等待take(),然后drainTo()使用所有待处理的更新并将它们一次性推送到服务器。使用单个多行 INSERT 以获得最大效率。

这种方法确保更新到达服务器时不会因轮询频率而产生任何无故延迟,同时随着容量的增加,请求会变得更粗,因此更有效。

于 2010-05-15T12:21:36.027 回答
2

到目前为止,我最好的想法是将查询更新字符串添加到同步列表中,其中一个独立线程每 100 毫秒检查一次列表并执行它在那里找到的查询。

如果您不想阻塞主线程,这对我来说听起来不错,除了不使用同步列表和 100 毫秒轮询,而是使用一些BlockingQueue实现。LinkedBlockingQueue应该完成这项工作,如果你让它不受限制,它永远不会阻塞你的主线程。

于 2010-05-15T12:23:08.187 回答
0

我认为“INSERT DELAYED”可能是您正在寻找的,因为 INSERT 会立即返回,MySQL 将为您处理所有线程问题。但是,没有等效的 UPDATE 语句,因此您需要重写代码,以便仅使用 INSERT 或 REPLACE。

于 2010-07-04T01:21:24.333 回答