当前位置: 首页 > news >正文

【数据库连接池】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;
}

相关文章:

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

连接池初始化 OVERVIEW 连接池初始化1.Connection类Connection.hConnection.cpp 2.CommonConnectionPool类CommonConnectionPool.hCommonConnectionPool.cpp 1.Connection类 封装Connection类&#xff0c;在该类内调用mysql提供的接口实现对数据库的增删改查&#xff0c; Con…...

Java基于springboot开发的土特产网站商城多商家源码

主要功能&#xff1a;用户可以浏览特产&#xff0c;按分类和产地搜索&#xff0c;按分类查询特产&#xff0c;搜索店铺&#xff0c;查看评价&#xff0c;加入购物车&#xff0c;下单&#xff0c;查看店铺主页信息特产等店铺内搜索等&#xff1b;用户可申请开通店铺&#xff0c;…...

Linux CentOS7 LVM

LVM&#xff08;Logical Volume Manger&#xff09;逻辑卷管理&#xff0c;Linux磁盘分区管理的一种机制&#xff0c;建立在硬盘和分区上的一个逻辑层&#xff0c;提高磁盘分区管理的灵活性。物理设备&#xff0c;是用于保留逻辑卷中所存储数据的存储设备。它们是块设备,可以是…...

ArkTS开发webview,html页面中的input和按钮等操作均无响应 【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案(根据此方法即可解决此Bug):本文相关知识本Bug常规排除步骤ArkTS项目场景: 在鸿蒙开发过程遇到的问题: 问题 ArkTS API9 使用webview加载的html,页面中的按钮和input等操作均无响应 是有相关API设置webview是否可以touch或…...

滴滴、阿里云、语雀相继宕机,损失巨大,软件的高可用失效了么?

在北京寒冬的夜里&#xff0c;小程加班完成了当天最后一个任务&#xff0c;他拖着疲惫的身体离开了位于西二旗的工位&#xff0c;走到办公楼下&#xff0c;下意识地拿出手机打开滴滴&#xff0c;准备打车回家&#xff0c;但是他却发现滴滴的打车页面显示网络异常。起初小程以为…...

基于binlog实现一些业务(Binlog4j)

前言 今天要跟大家分享的是监控数据变化&#xff0c;实现自己的业务的另一个思路&#xff0c;基于数据库的binglog。我这里是用的Binlog4j实现&#xff0c;希望看总结的&#xff0c;直接看最后。 一、Binlog4j是什么&#xff1f; Binlog4j是轻量级 Mysql Binlog 客户端, 提供宕…...

python实现rpc的几种方式(SimpleXMLRPCServer 自带的、第三方ZeroRPC)、连接linux远程开发分布式锁、分布式id

1 python实现rpc的几种方式 1.1 SimpleXMLRPCServer 自带的 1.2 第三方ZeroRPC 2 连接linux远程开发 3 分布式锁 4 分布式id 1 python实现rpc的几种方式 # 远程过程调用-1 借助于rabbitmq,可以跨语言-2 SimpleXMLRPCServer 自带的-3 ZeroRPC-4 GRPC&#xff1a;跨语言的 htt…...

ARM麒麟V10 auditctl启动失败处理

问题&#xff1a; 业务服务器需要启用审计服务&#xff0c;但是启动审计服务失败&#xff0c;查看状态提示audit0。 修改配置文件/boot/efi/EFI/kylin/grub.cfg 删除audit0&#xff0c;或者设置audit1。 重启服务器后验证状态。 auditctl -D echo "-w /data -p rwxa"…...

day67

今日回内容 视图层 响应对象 cbv和fbv 上传文件 模板层 视图层 一、响应对象 响应对象的本质都是 HttpResponse HttpResponse:字符串 render&#xff1a; 将一个模板页面中的模板语法进行渲染&#xff0c;最终渲染成一个html页面作为响应体。 redirect&#xff1a;重定向 …...

04:2440---内存控制器

目录 一:介绍 1:引入 2:概念 3:通信 A:片选信号 B:片选信号的地址空间范围 ​​​​ 4:地址线 A:不同位数的接法 B:访问原理 C:访问地址 5:时序 1:NOR FLASH A:2440NOR FLASH时序 B:原理/时序图 C:寄存器 6:SDARM A:访问方式 B:原理图 C:BWSCON D:BANKCON…...

【深度学习】CNN中pooling层的作用

1、pooling是在卷积网络&#xff08;CNN&#xff09;中一般在卷积层&#xff08;conv&#xff09;之后使用的特征提取层&#xff0c;使用pooling技术将卷积层后得到的小邻域内的特征点整合得到新的特征。一方面防止无用参数增加时间复杂度&#xff0c;一方面增加了特征的整合度…...

基于H1ve一分钟搭好CTF靶场

写在前面 ◉ ‿ ◉ 上一篇文章给大家详细介绍了基于H1ve搭建CTF靶场&#xff0c;以及过程中可能遇到的报错及解决方法&#xff0c;那么这篇文章&#xff0c;我总结了一下&#xff0c;将不会遇到报错的方法给到大家&#xff0c;但是前提是你的服务器最好是一个全新的哦~~~ 我…...

网络篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、如何实现跨域?二、TCP 为什么要三次握手,两次不行吗?为什么?三、说一下 TCP 粘包是怎么产生的?怎么解决粘包问题的?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站…...

Git——Git应用入门

将会介绍以下知识&#xff1a; 搭建Git环境和创建Git版本库&#xff08;init、clone&#xff09;。文件添加、状态检查、创建注释和查看历史记录。与其他Git版本库交互&#xff08;pull、push&#xff09;。解决合并冲突。创建分支列表、列表切换和合并。创建标签。 1、版本控…...

【SpringBoot】Redisson 分布式锁注解和 @Transactional 注解一起使用问题

一、前言 平时使用切面去加分布式锁&#xff0c;是先开启事务还是先尝试获得锁&#xff1f;这两者有啥区别&#xff1f; 业务中怎么控制切面的顺序&#xff1f;切面的顺序对事务的影响怎么避免&#xff1f; 下面程序分析&#xff1a; OverrideTransactionalpublic ReceiveH5…...

Druid数据库连接池框架

1.Druid概述 Druid 是一个开源的数据库连接池框架&#xff0c;用于管理和优化数据库连接的使用。它提供了高效的、可扩展的连接池管理&#xff0c;可以用于 Java 应用程序连接到关系型数据库。 之前有了解过 C3P0 数据库连接池&#xff0c;所谓数据库连接池就是重复利用连接数据…...

Python项目打包

Python项目如何打包&#xff1f; 本指南总结了Python项目打包的最佳实践&#xff0c;主要涉及代码的打包和分发&#xff0c;以及环境和依赖的管理。 0. 一般项目清单 源代码&#xff08;可使用git托管&#xff09;数据包&#xff08;可使用DVC托管&#xff09;Docker环境镜像…...

ASUS(华硕) B760M-AYW WIFI D4_解决wifi不能使用

1、最近新购买了一套 diy电脑主机&#xff0c;选用的是 ASUS B760M-AYW WIFI D4电脑主板 win10 系统&#xff0c;到货后 发现右下角电脑图标处及网络适配器中 没有wifi选项 首先 在官网和旗舰店客服处&#xff0c;确认了 该主板 有集成wifi模块&#xff0c;鲨鱼鳍天线未安装…...

Postgresql数据库运维统计信息

如果需要使用以下运维信息&#xff0c;需要如下几步 修改postgresql.conf文件 #shared_preload_libraries # (change requires restart)shared_preload_libraries pg_stat_statements重启数据库创建扩展 CREATE EXTENSION IF NOT EXISTS pg_stat_statements;1. 统计信息…...

Python3基础

导包 在 python 用 import 或者 from...import 来导入相应的模块。 将整个模块(somemodule)导入&#xff0c;格式为&#xff1a; import somemodule 从某个模块中导入某个函数,格式为&#xff1a; from somemodule import somefunction 从某个模块中导入多个函数,格式为&#…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...