文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于C++实现Mysql数据库连接池实例

2022-12-07 10:00

关注

项目技术点

项目意义

高并发场景下, 频繁创建, 销毁连接带来的性能损耗

三次握手,连接认证(身份权限认证),MySQL资源释放, 四次挥手

每一次client 访问 Mysql server都需要进行上述操作. 上述这些操作是固定的流程. 真正的sql语句执行操作才是我们无法逃脱的, 所以上述这些我们完全可以提前创建出来,然后进行不断的复用connections. 实现mysql server访问的性能提升.

思考: 提前创建好的 connetions 数目是否是越多越好?

当然是不可能,因为每一个connection都是需要占据一定的系统资源的, 创建过多的connection 会导致服务器资源紧张. 起码per connection per socketfd (套接字资源)

思考: connections 数目设计?

上下限限制数目. initSize控制下限. maxSize控制连接上限 (一般是系统的最大mysql connetions num)

多余connection最长闲置时间限制: maxIdleTime (及时释放闲置连接)

资源紧张, 并发访问量高. 没有连接可用 :connectionTimeout (return error, 获取连接超时时间)

项目实现

Connection设计

数据成员

MYSQL* _conn;         //连接句柄                                  
clock_t _startTime;   //连接起始空闲时间

操作接口

Connection();            //构造 init Connection
~Connection();           //析构 destroy connection
bool connect(ip, port, username, password, dbname);     //连接操作, 返回连接结果
bool update(sql);        //表更新操作, 返回更新结果 
MYSQL_RES* query(sql);   //查询操作, 返回查询结果
void refreshStartTime(); //刷新连接起始空闲时间
clock_t getAliveTime();  //获取连接空闲时间

ConnectionPool设计

数据成员

//连接登录信息
string _ip;
unsigned short _port;
string _username;
string _password;
string _dbname;
//连接数量等配置信息
int _initSize;
int _maxSize;
int _maxIdleTime;
int _connectionTimeout;
//连接存储信息,以及保证线程安全
queue<Connection*> _connectionQue;
mutex _queueLock;
condition_variable _cond;
atomic_int _connectionCnt;

操作接口

ConnectionPool();                          //构造 init pool, 加载配置, 初始连接, 启动线程
static ConnectionPool* getConnectionPool();//获取单例
shared_ptr<Connection> getConnection();    //获取连接
int _loadConfigFile(string& filename);     //加载解析配置信息
void produceConnectionTask();              //生产连接任务
void scannerConnetionTask();               //扫描监视销毁空闲线程任务

项目复杂接口细节刨析

getConnection()


shared_ptr<Connection> getConnection() {
    unique_lock<mutex> auto_lock(_queueLock);//定义智能锁
    while (_connectionQue.empty()) {
        if (cv_status::timeout == _cond.wait_for(auto_lock,                                          chrono::milliseconds(_connectionTimeout))) { //达到连接超时时间
            if (_connectionQue.empty()) {
                //LOG DEBUG INFO
                cerr << "获取连接超时" << endl;
                return nullptr;
            }
        }
    }
    //定义shared_ptr<Connection> 自定义del函数, 而非直接调用~T()
    shared_ptr<Connection> sp(_connectionQue.front(), [&](Connection* pconn){
        unique_lock<mutex> auto_lock(_queueLock);
        pconn->refreshStartTime();      //刷新连接起始空闲时间
        _connectionQue.push(pconn);
    });
    _connectionQue.pop();
    _cond.notify_all();                 //弹出任务, queue maybe empty notify produce
    return sp;
}

produceConnectionTask()


void produceConnectionTask() {
    for (;;) {
        unique_lock<mutex> auto_lock(_queueLock);
        while (!_connectionQue.empty()) {
            _cond.wait(auto_lock);
        }
        if (_connectionCnt < _maxSize) {
            Connection* pconn = new Connection();
            pconn->connet(_ip, _port, _username, _password, _dbname);
            pconn->refreshStartTime();
            _connectionQue.push(pconn);
            _connectionCnt++;
        }
        _cond.notify_all(); //通知消费
    }
}
​

scannerConnetionTask()


void scannerConnectionTask() {
    for (;;) {
        //休眠maxIdleTime
    	this_thread::sleep_for(chrono::seconds(_maxIdleTime));   
        unique_lock<mutex> auto_lock(_queueLock);
        while (_connectionCnt > _initSize)
		{
			Connection *p = _connectionQue.front();
			if (p->getAliveeTime()/SECONDS_PER_SEC >= _maxIdleTime)
			{
				_connectionQue.pop();
				_connectionCnt--;
				delete p; // 调用~Connection()释放连接
			}
			else
			{
				break; // 队头的连接没有超过_maxIdleTime,其它连接肯定没有
			}
		}       
    }
}

到此这篇关于基于C++实现Mysql数据库连接池实例的文章就介绍到这了,更多相关C++数据库连接池内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯