Phase 5:MySQL 连接池

问题:每次 mysql_real_connect 开销很大(TCP 握手 + MySQL 握手)。Phase 1-4 每个业务操作都 new 一个 MySQL 对象 →connect → 用完析构关闭。高并发下连接数爆炸且性能差。

第 19 步:ConnectionPool 单例

文件:include/server/db/connectionpool.hpp

cpp 复制代码
 class ConnectionPool {
  public:
      static ConnectionPool *instance();  // 单例
      void init(host, user, passwd, db, port, poolSize);  // 预建 poolSize 个连接
      MYSQL *acquire(int maxWaitMs = 3000);  // 获取连接
      void release(MYSQL *conn);             // 归还连接

  private:
      queue<MYSQL*> pool_;
      mutex mtx_;
      condition_variable cv_;
  };

  // 关键设计 --- acquire(0) 非阻塞:
  MYSQL *acquire(int maxWaitMs = 3000) {
      unique_lock<mutex> lock(mtx_);
      if (pool_.empty()) {
          if (maxWaitMs == 0) return nullptr;  // ← 立即返回,绝不等待!
          cv_.wait_for(lock, chrono::milliseconds(maxWaitMs), ...);
      }
      // ...取连接
  }

  // 业务代码中 acquire(0) 非阻塞 + fallback 独立连接:
  bool MySQL::connect() {
      _conn = ConnectionPool::instance()->acquire(0);  // 尝试从池拿
      if (_conn != nullptr) {
          _fromPool = true;
          return true;
      }
      // Fallback: 自己建一个短连接
      _conn = mysql_init(nullptr);
      MYSQL *p = mysql_real_connect(_conn, ...);
      // ...
  }

第 20 步:修复 Commands out of sync

问题:mysql_use_result 是流式读取------结果集必须全部读完才能发下一条SQL。线程池并发场景下,同一连接可能一个查询没读完就被另一个线程用了。

修复:db.cpp 中改 mysql_use_result → mysql_store_result:

相关推荐
lzhdim1 小时前
100条常用SQL语句
数据库·sql·mysql·mybatis
天河归来1 小时前
从原始消息到业务数据:三层数据架构的设计与实践
数据库·数据仓库·架构
数据库小学妹1 小时前
金融数据库成本怎么算?五笔钱加一张TCO表
数据库·金融行业·数据库选型·国产化替代·tco·金融数据库
KaiwuDB2 小时前
KaiwuDB 分布式集群扩缩容,从原理到完整操作踩坑总结
运维·数据库·分布式
auspicious航2 小时前
PostgreSQL的备份与恢复
数据库·postgresql
这个DBA有点耶2 小时前
从 MySQL 到时序数据库:我帮朋友做迁移的完整记录
数据库·架构·dba
泡海椒3 小时前
深度解析JQuick-SQL AST到逻辑计划转换机制|分布式SQL原理
数据库·分布式·sql
心静财富之门3 小时前
Python 数据共享四种方案完整实例(同进程 / JSON / Redis / HTTP)
数据库·python·oracle
略略略咯咯3 小时前
啊啊啊啊啊
java·服务器·数据库
奇牙coding3 小时前
GPT-5.5 报 401 invalid_api_key 怎么办?换密钥前按 4 层排查请求头、项目权限和端点
数据库·gpt·ios·ai