2010-05-15 239 views
2

多人游戏我的工作,我想将事件记录到MySQL数据库无阻塞游戏更新线程,这样,如果数据库忙或表被锁定游戏不停止运行,同时等待写一个。非阻塞的MySQL更新与Java?

完成此操作的最佳方法是什么?

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

回答

2

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

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

2

BlockingQueue地更新。有一个单独的线程在take()的队列中等待,然后是drainTo()消耗所有未决的更新并一次性将它们推送到服务器。使用单个多行INSERT可实现最高效率。

这种方法确保更新点击服务器而没有任何延迟无端由于轮询频率,同时使大块,从而更有效地,请求作为体积爬升。

0

我觉得“插入延迟”可能是你在找什么,因为INSERT立即返回,而MySQL会为你处理所有的线程问题。但是,没有等效的UPDATE语句,因此您需要重写代码,以便仅使用INSERT或REPLACE。

+0

如果我没有记错,插入延迟仅支持MyISAM的不是InnoDB的。确保你对此感到满意。 – Wouter 2015-01-21 23:22:32