小工具知识网

当前位置: 首页 > 行业知识 > WebServer -- 数据库连接池

行业知识

WebServer -- 数据库连接池

2026-11-03 09:33:31 来源:互联网转载

���录

()

基础知识

整体内容

()

单例模式创建

连接池(代码实现)

初始化

获取 && 释放连接

销毁连接池

RAII 机制释放数据库连接

定义

实现


基础知识

什么是数据库连接池?

池是一组资源的集合,这组资源在服务器启动之初,就被完全创建好并初始化

通俗来说,池是资源的容器,本质上是对资源的复用

顾名思义,连接池中的资源为一组数据库连接,由程序动态的对池中的连接进行使用 / 释放

当系统开始处理客户请求时,如果它需要相关的资源,可以直接从池中获取,无需动态分配;

当服务器处理完一个客户连接后,可以把相关资源放回池中,无需执行系统调用释放资源

数据库访问的一般流程是什么?

当系统需要访问数据库时,先系统创建数据库连接,完成数据库操作,然后系统断开数据库连接

为什么要创建连接池?

从一般流程看,若系统需要频繁访问数据库,则需要频繁创建和断开数据库连接,

而创建数据库连接,是一个很耗时的操作,也容易对数据库造成安全隐患

在程序初始化的时候,集中创建多个数据库连接,并把它们集中管理,供程序使用,可以保证较快的数据库读写速度,更加安全可靠

整体内容

概述

池可以看作资源的容器,有多种实现方法:数组,链表,队列...

这里,使用 单例模式 和 链表 创建数据库连接池,实现对数据库连接资源的复用

TinyWebserver 中,数据库模块分 2 部分:

1)数据库连接池的定义

2)利用连接池完成登录注册的校验功能

具体地,工作线程从数据库连接池取得一个连接,访问数据库中的数据,访问完毕后将连接交还连接池

内容

本博客介绍数据库连接池的定义,具体涉及到:单例模式的创建,连接池代码的实现,RAII 机制释放数据库连接

  • 单例模式创建

    描述连接池的单例实现

  • 连接池代码实现

    对连接池的外部外文接口的理解

  • RAII 机制释放数据库连接

    描述连接释放的封装逻辑

    单例模式创建

    使用局部静态变量懒汉模式创建连接池

    class connection_pool{public:    // 局部静态变量单例模式    static connection_pool *GetInstance();private:    connection_pool();    ~connection_pool();};// 类外实现connection_pool *connection_pool::GetInstance(){    static connection_pool connPool;    return &connPool;}

    连接池(代码实现)

    连接池的定义中注释比较详细,这里仅对其实现进行解析

    连接池的功能:初始化,获取连接,释放连接,销毁连接池

    初始化

    值得注意的是,销毁连接池没有直接被外部调用,而是通过 RAII 机制来完成自动释放;

    使用信号量实现多线程争夺连接的同步机制,这里将信号量初始化为数据库的连接总数

    // 构造函数,初始化连接池中的连接数量connection_pool::connection_pool(){    this->CurConn = 0; // 当前连接数    this->FreeConn = 0; // 空闲连接数}// 析构函数,销毁连接池connection_pool::~connection_pool(){    DestroyPool(); // 销毁连接池}// 初始化连接池void connection_pool::init(string url, string User, string PassWord,                           string DBName, int Port, unsigned int MaxConn){    // 初始化数据库信息    this->url = url; // 数据库地址    this->Port = Port; // 数据库端口    this->User = User; // 用户名    this->PassWord = PassWord; // 密码    this->DatabaseName = DBName; // 数据库名称    // 创建 MaxConn 条数据库连接    for (int i = 0; i  

     

上一篇:cs怎么调用服务器?

下一篇:服务器节能率低怎么解决?