【发布时间】:2010-09-07 11:54:48
【问题描述】:
是否存在可在 C 或 C++ 应用程序中使用的 Mysql 异步连接器?我正在寻找可以插入reactor pattern 的东西,写在Boost.Asio 中。
[编辑:] 不能在线程中运行同步连接器。
【问题讨论】:
标签: c++ mysql c asynchronous boost-asio
是否存在可在 C 或 C++ 应用程序中使用的 Mysql 异步连接器?我正在寻找可以插入reactor pattern 的东西,写在Boost.Asio 中。
[编辑:] 不能在线程中运行同步连接器。
【问题讨论】:
标签: c++ mysql c asynchronous boost-asio
我知道这是一个老问题,但考虑看看新的 Boost.Mysql 库:https://anarthal.github.io/mysql/index.html
【讨论】:
http://forums.mysql.com/read.php?45,183339,183339 享受
更新了原始文章的链接,展示了如何进行异步 mysql 查询:
http://jan.kneschke.de/projects/mysql/async-mysql-queries-with-c-api/
【讨论】:
我认为唯一的解决方案是创建一个包装standard connector 的异步服务。不过,您需要了解 ODBC API。
【讨论】:
您是否考虑过使用libdrizzle?我只使用了一个旧版本,从它与 drizzle 的单独项目开始,我测试了异步查询功能,但我从未做过任何值得一提的实际基准测试。
【讨论】:
MySQL Connector/C++ 是 JDBC 4.0 的 C++ 实现
使用 MySQL Connector/C++ 的参考客户有: - OpenOffice - MySQL 工作台
【讨论】:
[ 不能在线程中运行同步连接器 想一想:您正在使用的 libmysqlclient / mysqlclient.dll 进行同步套接字调用。操作系统调度程序会正确切换到另一个线程,直到 I/O 完成]
这让我很烦! - “另一个线程”很容易成为第二次同步。连接到 mysql,并且应该由 mysql 处理,就像它完全处理另一个客户端一样?我的直觉是它应该使用多个线程来工作。
【讨论】:
有一个名为 DBSlayer 的项目,它在 MySQL 前面放置了另一个层,您可以通过 JSON 与之对话。 http://code.nytimes.com/projects/dbslayer
【讨论】:
我在使用非常不同的技术时遇到了类似的问题: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 套接字。就像代理一样。
【讨论】: