【数据库连接池】01:连接池初始化

连接池初始化


OVERVIEW

  • 连接池初始化
      • 1.Connection类
        • Connection.h
        • Connection.cpp
      • 2.CommonConnectionPool类
        • CommonConnectionPool.h
        • CommonConnectionPool.cpp

1.Connection类

封装Connection类,在该类内调用mysql提供的接口实现对数据库的增删改查,

Connection.h
#ifndef _CONNECTION_H
#define _CONNECTION_H#include <string.h>
#include <iostream>
#include <mysql/mysql.h>
using namespace std;#define LOG(str)									\cout << __FILE__ << ":" << __LINE__ << " " <<	\__TIMESTAMP__ << ":" << str << endl;// 封装Connection对象 实现数据库增删改查
class Connection {
public:// 初始化数据库连接Connection();// 释放数据库连接资源~Connection();// 连接数据库bool connect(string ip, unsigned short port, string user, string password, string dbname);// 更新数据库操作 insert delete updatebool update(string sql);
private:// 表示和 MYSQL Server的一条连接MYSQL *_conn;
};#endif
Connection.cpp
#include "Connection.h"Connection::Connection()
{_conn = mysql_init(nullptr);
}Connection::~Connection()
{if (_conn != nullptr) mysql_close(_conn);
}bool Connection::connect(string ip, unsigned short port, string user, string password, string dbname)
{MYSQL *p = mysql_real_connect(_conn, ip.c_str(), user.c_str(), password.c_str(), dbname.c_str(), port, nullptr, 0);return p != nullptr;
}// insert delete update
bool Connection::update(string sql)
{if (mysql_query(_conn, sql.c_str())) {LOG("update failed!~" + sql);return false;}return mysql_use_result(_conn);
}

2.CommonConnectionPool类

  • 需求分析:

    在整个系统中数据库连接池对象出现一次即可,有数据库连接需求时,从同一个数据库连接池中获取 Connection 对象即可,

    连接池不需要创建多个,所以可以通过单例模式来设计数据库连接池类,但是服务器肯定是多线程的,肯定会有多个线程都来获取连接池的单例,所以还需要保证数据库连接池的线程安全问题,

  • CommonConnectionPool类设计:需要通过单例模式实现,并保证数据库连接池的线程安全问题(线程安全的单例),

  • 功能实现:启动连接池构造函数,读取基本的配置文件、初始化连接池数量initSize

CommonConnectionPool.h
#ifndef _COMMONCONNECTIONPOOL_H
#define _COMMONCONNECTIONPOOL_H#include <queue>
#include <string>
#include <mutex>
#include <atomic>
#include <thread>
#include "Connection.h"
using namespace std;// 实现连接池功能模块
class ConnectionPool {
public:static ConnectionPool* getConnectionPool();
private:ConnectionPool();bool loadConfigFile();// 连接池参数int _initSize;				// 初始连接量int _maxSize;				// 最大连接量int _maxIdleTime;			// 最大空闲时间int _connectionTimeout;		// 连接超时时间// 数据库信息string _ip;unsigned short _port;string _username;string _password;string _dbname;// 数据库连接存储queue<Connection*> _connectionq;		// 存储mysql连接的队列mutex _queueMutex;						// 维护连接队列的线程安全的互斥锁atomic_int _connectionCnt;				// 创建连接的数量 ++操作是线程安全的
};#endif
CommonConnectionPool.cpp
#include "public.h"
#include "CommonConnectionPool.h"// 懒汉单例模式
// 对于静态局部变量的初始化 由编译器自动进行 lock与unlock
ConnectionPool* ConnectionPool::getConnectionPool()
{static ConnectionPool pool;return &pool;
}// 初始化连接池
ConnectionPool::ConnectionPool() {// 1.加载配置项if (!loadConfigFile()) return;// 2.创建初始数量的连接for (int i = 0; i < _initSize; ++i) {Connection *p = new Connection();p->connect(_ip, _port, _username, _password, _dbname);_connectionq.push(p);_connectionCnt++;}// 3.启动一个新的线程作为连接的生产者
}// 读取配置文件
bool ConnectionPool::loadConfigFile()
{FILE *fp = fopen("config.conf", "r");if (fp == nullptr) {LOG("Config file error, file not exists!");return false;}while (!feof(fp)) {// 逐行读取配置文件char line[1024] = { 0 };fgets(line, 1024, fp);string str = line;// 查找配置项int idx = str.find('=', 0);if (idx == -1) continue;// 无效配置项int edx = str.find('\n', 0);string key = str.substr(0, idx);string value = str.substr(idx + 1, edx - idx - 1);// 初始化成员变量if (key == "ip") {_ip = value;} else if (key == "port") {_port = atoi(value.c_str());} else if (key == "username") {_username = value;} else if (key == "password") {_password = value;} else if (key == "dbname") {_dbname = value;} else if (key == "initSize") {_initSize = atoi(value.c_str());} else if (key == "maxSize") {_maxSize = atoi(value.c_str());} else if (key == "maxIdleTime") {_maxIdleTime = atoi(value.c_str());} else if (key == "connectionTimeout") {_connectionTimeout = atoi(value.c_str());}}return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/180902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT6 Creator编译KDDockWidgets并部署到QT

为什么使用KDDockWidgets 为什么使用KDDockWidgets呢&#xff1f; 首先它是一个优秀的开源dock库&#xff0c;弥补QDockWidget的不足&#xff0c;详情见官网。 其次它支持QML&#xff0c;这是我最终选择这个dock库的主要原因&#xff0c;因为最近在考虑将前端界面用QML做&…

观鹤笔记1

>> 夜里无光&#xff0c;但他眼睛里有一泓粼粼泛光的泉。哪怕他自己穿得很单薄&#xff0c;身子看起来冷得发僵&#xff0c;可那份在受刑前夜仍然能安坐于墙角的平静&#xff0c;却令杨婉觉得有些温暖。 入人世&#xff0c;虽重伤而不嫉。 邓瑛的这种人性&#xff0c;在2…

SSM训练营管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 训练营管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系 统主要采用B/S模…

金字塔原理

金字塔原理 来自于麦肯锡公司的第一位女性咨询顾问芭芭拉•明托的著作《金字塔原理》。 原理介绍 此原理是一种重点突出、逻辑清晰、主次分明的逻辑思路、表达方式和规范动作。 金字塔的基本结构是&#xff1a;中心思想明确&#xff0c;结论先行&#xff0c;以上统下&#xff…

python学习之偏函数partial

偏函数的使用 作用&#xff1a;可以给已有的函数传入一部分参数&#xff0c;将其打包成另外一个函数源码&#xff1a;https://docs.python.org/3.7/library/functools.html#functools.partialdef partial(func, *args, **keywords):def newfunc(*fargs, **fkeywords):newkeywo…

Maven——坐标和依赖

Maven的一大功能是管理项目依赖。为了能自动化地解析任何一个Java构件&#xff0c;Maven就必须将它们唯一标识&#xff0c;这就依赖管理的底层基础——坐标。将详细分析Maven坐标的作用&#xff0c;解释其每一个元素&#xff1b;在此基础上&#xff0c;再介绍如何配置Maven&…

PostgreSQL日志中的SQL记录时机 —— log_statement 和 log_min_duration_statement

最近跟朋友讨论到PostgreSQL日志中的SQL记录时机&#xff0c;研究了下log_statement 和 log_min_duration_statement两个参数&#xff0c;记录一下。 一、 参数简介 1. log_statement ① 作用 控制记录SQL的类型&#xff0c;可选值为&#xff1a; none&#xff1a;关闭&…

C语言-求阶乘序列前N项和

本题要求编写程序&#xff0c;计算序列 1!2!3!⋯ 的前N项之和。 输入格式: 输入在一行中给出一个不超过12的正整数N。 输出格式: 在一行中输出整数结果。 输入样例: 5输出样例: 153 #include "stdio.h" int main(){int n;int sum 0;scanf("%d",&a…

Unity中Shader的BRDF解析(四)

文章目录 前言一、BRDF 中的 IBL二、解析一下其中的参数1、光照衰减系数 &#xff1a;surfaceReduction2、GI镜面反射在不同角度下的强弱 &#xff1a;gi.specular * FresnelLerp (specColor, grazingTerm, nv);在BRDF中&#xff0c;IBL&#xff08;Image Based Light&#xff…

CF 1896 A. Jagged Swaps 学习笔记

链接 传送门 代码 #include<bits/stdc.h>using namespace std;const int N20;int a[N];int main() {int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i1;i<n;i){scanf("%d",&a[i]);}if(a[1]1) printf(&q…

【人工智能】人工智能的技术研究与安全问题的深入讨论

前言 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 &#x1f4d5;作者简介&#x…

波兰边缘计算初创公司获得450w欧元融资

边缘计算社区获悉&#xff0c;近期&#xff0c;波兰边缘计算初创公司CTHINGS.CO 获得450w欧元A轮融资。 以下是官方声明&#xff1a; CTHINGS.CO 获得 2000 万兹罗提&#xff08;约450 万欧元&#xff09;用于国际扩张。此轮融资涉及 ORLEN VC、PKO VC、Freya Capital 和现有投…

embeddings

“embeddings”的中文翻译是“嵌入”或“嵌入向量”。在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;通常被称为“词向量”或“词嵌入”&#xff0c;它是表示词汇或令牌的一种方式&#xff0c;通过将这些词汇或令牌映射到一个向量空间中的点&#xff0c;以捕捉它们…

芯片设计中的DFX

在芯片设计领域&#xff0c;“DFX” 通常指的是 Design for eXcellence&#xff0c;其中X也可以看作是通配符。DFX 强调在芯片设计的各个阶段&#xff08;设计、验证、测试等&#xff09;考虑到各种因素&#xff0c;以达到卓越的设计质量和可维护性。DFX 的具体要求可能包括&am…

「Verilog学习笔记」整数倍数据位宽转换8to16

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 根据时序图&#xff0c;数据是在第二个数据到来之后输出&#xff0c;当仅有一个数据到来时&#xff0c;不产生输出&#xff0c;所以内部需要一个指示信号valid_cnt&#xf…

VMware虚机重启后静态IP不生效

配置好一套虚机之后&#xff0c;因为重启电脑&#xff0c;导致虚机的静态ip配置不生效&#xff0c;xshell连接不上虚机。以下是自查和解决方案&#xff1a; 1.使用su -进入root用户 2.查看打开虚机的teminal窗口查看配置的ip文件&#xff1a;vim /etc/sysconfig/network-script…

N8975A/安捷伦Agilent N8975A噪声系数分析仪

181/2461/8938产品概述N8975A是一款高性能噪声系数分析仪 用于进行快速、准确且可重复的噪声系统测量。 N8975A易用的特性能将复杂的测量简单化并让您获得值得信任的可重复且可靠的测量结果。 N8975A可同时提供噪声系数和增益测量&#xff0c;并可以多种格式查看、打印和保存…

Python与设计模式--访问者模式

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…

学习知识随笔(Django)

文章目录 MVC与MTV模型MVCMTV Django目录结构Django请求生命周期流程图路由控制路由是什么路由匹配反向解析路由分发 视图层视图函数语法reqeust对象属性reqeust对象方法 MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式&#xff0c;所谓MVC就是把Web应用分为模型(M&#…

2023-简单点-yolox-pytorch代码解析(一)-nets/darknet.py

yolox-pytorch: nets/darknet.py yolox网络结构yolox-pytorch目录今天解析注释net/darknet.pyFocusBaseConvDWConvSPPBottleneckDarknet未完待续。。。 yolox网络结构 yolox-pytorch目录 今天解析注释net/darknet.py #!/usr/bin/env python3 # 指定使用python3来执行此脚本 …