V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
cpprookie
V2EX  ›  MySQL

分享一个纯异步 MySQL 客户端

  •  2
     
  •   cpprookie · 2022-02-07 21:38:20 +08:00 · 2446 次点击
    这是一个创建于 1018 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近发现了一个简单易用,性能非常强大的纯异步 mysql 客户端 -- c++ Workflow ,无需依赖任何库。

    项目地址 : https://github.com/sogou/workflow

    先看看简单例子如何使用

    #include "workflow/Workflow.h"
    #include "workflow/WFTaskFactory.h"
    #include "workflow/MySQLResult.h"
    
    using namespace protocol;
    
    int main()
    {
        std::string url = "mysql://root:123@localhost";
        WFMySQLTask *task = WFTaskFactory::create_mysql_task(url, 0, [](WFMySQLTask *task)
        {
            MySQLResponse *resp = task->get_resp();
            MySQLResultCursor cursor(resp);
            std::vector<MySQLCell> arr;
            while (cursor.fetch_row(arr))
            {
                fprintf(stderr, "[%s]\n", arr[0].as_string().c_str());
            }
        });
        task->get_req()->set_query("SHOW DATABASES");
        task->start();
        getchar();
    }
    

    创建 MySQL 任务非常简单,有如下几个核心元素

    1. url 参数,mysql://uname:pwd@host:port/dbname ,还支持以 SSL 连接访问 MySQL ,mysqls://

    2. set_query ,执行的 SQL 语句;

    3. callback ,异步返回结果的回调

    4. 结果集

    一个 MySQLResponse 里包含若干 ResultSet ,一个 ResultSet 包含若干 Row, 一个 Row 包含若干 Field ,很轻松的进行结果集处理,规避掉各种细节。

    除了常见的 sql 的增删改查、建库删库、建表删表、预处理等等,还支持多语句多结果集,事务等其他的功能特性。

    所有命令都可以拼接到一起通过 set_query() 传给 WFMySQLTask (包括 INSERT/UPDATE/SELECT/DELETE/PREPARE/CALL )。

    举个例子

    req->set_query("SELECT * FROM table1; CALL procedure1(); INSERT INTO table3 (id) VALUES (1);");
    

    在返回的 MySQL Response 中,有多个 ResultSet ,遍历即可

    作为 workflow 原生自有协议的一部分,它与任务流,服务治理能特性完美融合,与 http ,redis ,计算任务统一使用,并能够通过 upstream 轻松实现读写分离。通过 workflow 灵活的任务流机制,支持 MySQL 存储过程。

    高性能

    除了易用性外,最为重要的就是 workflow 的高性能。在合理配置下,每秒能处理几万次 MySQL 请求。

    在传统的 MySQL 客户端,往往是同步阻塞式的,在向 MySQL 发送请求到 MySQL 回复响应的过程中,整个线程处于阻塞等待状态。如果希望提高并发处理能力,往往要设置大量的工作线程,而工作线程的切换,以及临界资源的锁争夺,性能会有较大的影响。

    而作为异步 MySQL 客户端,向 MySQL 发送请求之后,线程就可以执行本地其他异步调用,或者发送下一个 MySQL 请求,无任何阻塞,用很少的线程,就能拥有很高的并发处理能力。

    Image

    更多信息请看:

    Workflow MySQL 中文文档 : https://github.com/sogou/workflow/blob/master/docs/tutorial-12-mysql_cli.md

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5247 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:47 · PVG 16:47 · LAX 00:47 · JFK 03:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.