【问题标题】:Asynchronous Mysql connector异步 Mysql 连接器
【发布时间】:2010-09-07 11:54:48
【问题描述】:

是否存在可在 C 或 C++ 应用程序中使用的 Mysql 异步连接器?我正在寻找可以插入reactor pattern 的东西,写在Boost.Asio 中。

[编辑:] 不能在线程中运行同步连接器。

【问题讨论】:

    标签: c++ mysql c asynchronous boost-asio


    【解决方案1】:

    我知道这是一个老问题,但考虑看看新的 Boost.Mysql 库:https://anarthal.github.io/mysql/index.html

    【讨论】:

    • 这看起来很棒,绝对是一个不错的选择。
    • 免责声明:我是图书馆作者。它尚未在 Boost 中被接受,因此在被接受之前预计会发生重大变化。我希望审查过程尽快开始。如果您有任何问题/cmets,请随时在 GitHub 中打开问题 :)
    【解决方案2】:

    http://forums.mysql.com/read.php?45,183339,183339 享受

    更新了原始文章的链接,展示了如何进行异步 mysql 查询:

    http://jan.kneschke.de/projects/mysql/async-mysql-queries-with-c-api/

    【讨论】:

    • 在这个实现中,阻塞连接是一个严重的问题,但似乎还是按照我最初的要求去做。 drizzle 项目 (launchpad.net/drizzle) 正在开发一个将向后兼容 Mysql 的异步客户端(此处提到:oddments.org/?p=20
    【解决方案3】:

    我认为唯一的解决方案是创建一个包装standard connector 的异步服务。不过,您需要了解 ODBC API。

    【讨论】:

      【解决方案4】:

      您是否考虑过使用libdrizzle?我只使用了一个旧版本,从它与 drizzle 的单独项目开始,我测试了异步查询功能,但我从未做过任何值得一提的实际基准测试。

      【讨论】:

      • 我在创建这个问题时确实快速浏览了 Drizzle 项目(请参阅我对已接受答案的评论)。当时他们正在开发一个异步客户端。我真的不知道结果如何。
      【解决方案5】:

      MySQL Connector/C++ 是 JDBC 4.0 的 C++ 实现

      使用 MySQL Connector/C++ 的参考客户有: - OpenOffice - MySQL 工作台

      了解更多:http://forums.mysql.com/read.php?167,221298

      【讨论】:

        【解决方案6】:

        [ 不能在线程中运行同步连接器 想一想:您正在使用的 libmysqlclient / mysqlclient.dll 进行同步套接字调用。操作系统调度程序会正确切换到另一个线程,直到 I/O 完成]

        这让我很烦! - “另一个线程”很容易成为第二次同步。连接到 mysql,并且应该由 mysql 处理,就像它完全处理另一个客户端一样?我的直觉是它应该使用多个线程来工作。

        【讨论】:

        • 它将在线程中工作。但是假设您希望拥有 100 个连接而不是一台或多台服务器。并不是我认为任何人都会这样做,而是为了争论而接受它。然后我应该启动 100 个线程(甚至线程池中只有 10 个......)?这是一个相当大的开销。
        【解决方案7】:

        有一个名为 DBSlayer 的项目,它在 MySQL 前面放置了另一个层,您可以通过 JSON 与之对话。 http://code.nytimes.com/projects/dbslayer

        【讨论】:

          【解决方案8】:

          我在使用非常不同的技术时遇到了类似的问题:Twisted python(基于反应器的 IO)和 sqlAlchemy(??)。在寻找解决方案时,我发现了一个 sAsync 项目,它只是为 sqlAlchemy 创建了一个单独的线程,然后响应请求。

          鉴于 ASIO 基于低级 OS 功能(例如 aio_read() 或 ReadFileEx() 等)和 OS 级反应器(或在 Windows 的情况下为前摄器),我认为您没有其他机会了通过类似的方式模拟“异步”。

          不能在线程中运行同步连接器

          想一想:您正在使用的libmysqlclient / mysqlclient.dll 进行同步套接字调用。操作系统调度程序会正确切换到另一个线程,直到 I/O 完成,那么有什么区别呢? (除了你不应该为此创建 2k 线程的事实之外......)

          编辑:mysql_real_connect() 支持 UNIX 套接字参数。据说您可以从 mysql 服务器端口读取自己并仅使用 ASIO 写入该 UNIX 套接字。就像代理一样。

          【讨论】:

            猜你喜欢
            • 2011-08-07
            • 1970-01-01
            • 2021-07-08
            • 1970-01-01
            • 2021-12-17
            • 1970-01-01
            • 2023-04-08
            • 2015-08-07
            • 2020-11-26
            相关资源
            最近更新 更多