异步Mysql连接器

21

是否存在可以在C或C++应用程序中使用的MySQL异步连接器?我正在寻找可以插入反应器模式中的东西,并且是用Boost.Asio编写的。

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

8个回答

6

1
阻塞连接是这个实现中的一个严重问题,但似乎仍然能够完成我最初的请求。Drizzle项目(https://launchpad.net/drizzle)正在开发一款异步客户端,该客户端将向后兼容Mysql(在此提到:http://www.oddments.org/?p=20)。 - Thomas Watnedal

2
我曾遇到一个类似的问题,使用不同的技术:Twisted python(反应器IO)和sqlAlchemy(??)。在寻找解决方案时,我了解到sAsync项目,它仅为sqlAlchemy创建了一个单独的线程,并响应请求。
鉴于ASIO基于低级的操作系统特性(例如aio_read()或ReadFileEx()等),以及操作系统级别的反应器(在Windows的情况下是proactor),我认为您没有其他选择,只能通过类似的方法来模拟“异步性”。
“在线程中运行同步连接器不是一个选项。”
想一想:您正在使用的libmysqlclient / mysqlclient.dll执行同步套接字调用。操作系统调度程序将正确地切换到另一个线程,直到I/O完成,那有什么不同? (除了您不应该为此创建2k个线程之外...)
编辑:mysql_real_connect()支持UNIX套接字参数。据说您可以仅使用ASIO从mysql服务器端口读取并写入该UNIX套接字,就像代理一样。

1

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

这让我很困扰!- '另一个线程'同样可以是第二个同步连接到mysql,并且应该由mysql处理,就像处理另一个客户端一样?我的直觉是,使用多个线程应该可以工作。


1
它将在线程中工作。但是假设您想要与一个或多个服务器建立100个连接。虽然我不认为有人会这样做,但出于论证的目的,请接受它。那么我应该启动100个线程(甚至只有10个在线程池中..)吗?这是相当大的开销。 - Thomas Watnedal

1

1

这听起来很棒,肯定是值得一试的好选择。 - Thomas Watnedal
免责声明:我是这个库的作者。它尚未被Boost接受,因此在被接受之前可能会有重大更改。我希望审核过程能够尽快开始。如果您有任何问题/评论,请随时在GitHub上开启一个问题 :) - anarthal

0

你有考虑使用 libdrizzle 吗?我只用过一个旧版本,从那时起它还是 drizzle 的独立项目,我测试了异步查询功能,但从未进行任何值得一提的实际基准测试。


我在创建这个问题时确实浏览了一下Drizzle项目(请参见我的对被采纳答案的评论)。当时他们正在开发异步客户端。我不太清楚最终的结果如何。 - Thomas Watnedal

0

0

我认为唯一的解决方案就是创建一个异步服务,封装一个标准连接器。但你需要了解ODBC API。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接