所做的项目有个需求,有一个线程接收Udp请求然后向mysql的一个表插入一行记录.由于不希望该功能过多占用CPU,因此只用一个线程。
一开始用mysql-connector-c++作为客户端,由于只有单线程,插入速度不如人意。
主要是原因是网络延迟太大,线程大部分时间阻塞在等待数据库返回数据,于是考虑用异步的方式访问数据库。
目前mysql官方只有C#版本的connector有async操作的支持, mysql-connector-c/c++ 都没有提供异步操作的API.
但mariadb-connector-c提供了兼容mysql的non-block API。
(该网页提到mysql-connector-c早就支持non-blocking,但没看出来怎么用,也找不到任何示例..)。
mariadb提供了一个使用异步API的demo,里面结合了libevent,最主要的部分是异步操作状态机的实现,看着比较费解,
我重新改写了,放在这里。
以下是一些测试结果(被插入记录的表使用InnoDB存储引擎;mysql数据库在同一台主机上;测试代码见 blocking,non-blocking):记录数阻塞式非阻塞式时间比10.0310.0291.1
1003.0110.6244.8
10000328.63667.0984.9
其中非阻塞式用了10个mysql连接。连接数增加时,耗时更少,几乎成反比(直到到达