【问题标题】:Non-blocking MySQL updates with java?使用 java 进行非阻塞 MySQL 更新?
【发布时间】:2011-02-19 20:48:04
【问题描述】:

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

最好的方法是什么?

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

【问题讨论】:

    标签: java mysql multithreading asynchronous c3p0


    【解决方案1】:

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

    【讨论】:

    • 如果我没记错的话,延迟插入仅适用于 myisam 而不适用于 innodb。确保您对此感到满意。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-09
        • 1970-01-01
        • 2014-03-23
        • 2012-11-28
        • 2020-01-16
        • 1970-01-01
        相关资源
        最近更新 更多