0

0

如何在c++中使用数据库连接池? (提升数据库访问性能)

尼克

尼克

发布时间:2026-02-02 13:00:32

|

449人浏览过

|

来源于php中文网

原创

自己实现轻量级连接池比接入重型第三方库更可控、更少踩坑;因std::shared_ptr不验证连接有效性、无空闲超时、无最大连接数限制、无获取超时机制,故不可靠。

如何在c++中使用数据库连接池? (提升数据库访问性能)

直接用现成的 C++ 数据库连接池库是可行的,但绝大多数项目最终会发现:自己实现一个轻量级连接池比强行接入重型第三方库更可控、更少踩坑。

为什么 std::queue + std::shared_ptr 不足以构成生产可用的连接池

很多人尝试用 std::queue<:shared_ptr>> 封装连接对象,结果在高并发下频繁出现超时或连接泄漏。根本原因在于:

  • std::shared_ptr 只管理生命周期,不控制连接的「有效性」——连接可能已断开但指针仍非空
  • 没有连接空闲时间限制,失效连接长期滞留池中,下次取出时直接报 MySQL server has gone awayconnection reset by peer
  • 缺乏最大连接数硬限制,突发请求可能瞬间创建数百个连接,压垮数据库或触发 Too many connections
  • 没有连接获取超时机制,线程可能无限阻塞在 pop()

推荐方案:基于 sqlite3/mysql-connector-c++ 的简易池骨架

以 MySQL 为例,使用官方 mysql-connector-c++(v8.0+)配合手动管理连接状态。关键不是“复用对象”,而是“复用 TCP 连接并验证其活性”:

  • 每次从池中取出连接前,必须执行轻量级校验(如 SELECT 1 或调用 sql::Connection::isValid()
  • 连接归还时,若校验失败或空闲超时(例如 > 60 秒),直接销毁而非放回池中
  • 池内连接数始终维持在 min_size ~ max_size 区间,新连接仅在需要且未达 max_size 时创建
  • 所有操作必须加锁,但粒度要细——只锁队列操作,不锁整个 SQL 执行过程

核心结构示意(省略异常处理与日志):

商易建站系统
商易建站系统

商易建站系统(Sunnyi Website System)是一款基于THINKPHP开发制作的多语言CMS建站系统,其适用范围广,扩展性强,方便二次开发.商易建站系统使用了PHP缓存技术,可减少数据库访问,降低数据库压力,加速系统访问速度,提升系统性能.程序添加多种支付接口(财付通,支付宝等),并可自定配送方式. 功能介绍:1.数据库备份还原2.产品管理3.会员管理4.广告管理5.系统设置6.文章

下载

立即学习C++免费学习笔记(深入)”;

class ConnectionPool {
private:
    std::queue> idle_;
    std::mutex mtx_;
    size_t max_size_ = 20;
    size_t cur_size_ = 0;
    std::chrono::seconds idle_timeout_{60};

public:
    std::unique_ptr acquire() {
        std::lock_guard lk(mtx_);
        if (!idle_.empty()) {
            auto conn = std::move(idle_.front());
            idle_.pop();
            if (!conn->isValid()) {
                conn.reset(); // 丢弃失效连接
                return createNewConnection();
            }
            return conn;
        }
        return cur_size_ < max_size_ ? createNewConnection() : nullptr;
    }

    void release(std::unique_ptr conn) {
        if (!conn || !conn->isValid()) return;
        std::lock_guard lk(mtx_);
        idle_.push(std::move(conn));
    }

private:
    std::unique_ptr createNewConnection() {
        cur_size_++;
        try {
            return std::unique_ptr(
                driver_->connect("tcp://127.0.0.1:3306", "user", "pass")
            );
        } catch (...) {
            cur_size_--;
            throw;
        }
    }
};

实际部署时最容易被忽略的三个点

很多团队花几天搭好池子,上线后性能反而下降,问题往往出在这些细节:

  • MySQL 服务端的 wait_timeout 默认是 28800 秒(8 小时),但客户端池的空闲回收策略如果设为 300 秒,就可能出现连接被服务端单方面关闭而池子还不知道的情况 —— 必须同步调整 MySQL 配置或启用 autoReconnect=true(注意该参数在 v8.0+ 已废弃,改用 RECONNECT 选项)
  • 连接池对象必须是进程级单例,不能按请求新建;否则每个线程都持有一个池,等于没池
  • 事务场景下,连接不能中途归还 —— 必须由业务层明确调用 release(),否则会出现「连接被其他线程复用,导致事务上下文错乱」

连接池本身不解决慢查询,也不绕过锁竞争。它只是把「建连/断连」这个昂贵操作摊平。真正卡住性能的,往往是没索引的 SELECT * 或未绑定参数的拼接 SQL —— 池子越快,这类问题暴露得越彻底。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

792

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

330

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

350

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1324

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

363

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

922

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

425

2024.04.29

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

16

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 820人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号