使用java进行非阻塞MySQL更新?

时间:2010-05-15 11:59:05

标签: java mysql multithreading asynchronous c3p0

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

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

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

3 个答案:

答案 0 :(得分:2)

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

这种方法可以确保更新服务器在没有任何由于轮询频率造成的无端延迟的情况下更新服务器,同时随着数量的增加而产生更大的,更高效的请求。

答案 1 :(得分:2)

  

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

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

答案 2 :(得分:0)

我认为“INSERT DELAYED”可能就是你要找的东西,因为INSERT会立即返回,而MySQL会为你处理所有的线程问题。但是,没有等效的UPDATE语句,因此您需要重写代码,因此您只使用INSERT或REPLACE。