C++ 连接池(基类), 被继承后可以兼容Mysql连接池和Redis连接池

该博客介绍了如何设计一个C++的连接池抽象类,适用于Mysql、Redis和Oracle数据库。这个抽象类允许子类继承以创建特定数据库的连接池,实现了连接的获取和返还,以及连接池的管理,包括定期清理空闲和断开的连接。文章提供了头文件和源代码供读者参考和扩展。
摘要由CSDN通过智能技术生成

程序类型: C++连接池抽象类

适用平台: Linux

适用数据库: Mysql(亲测可用), Redis(亲测可用), Oracle(亲测可用)

适合读者: C/C++初学者学习交流使用

使用注意: 此类属于C++抽象类, 必须被继承后使用

简单介绍: 这段时间开发服务器涉及到redis和mysql数据库连接池, 在网上翻阅资料基本上都是针对性的,比如针对mysql设计的mysql连接池, 针对redis设计的redis连接池, 自己想了想, 都是连接池, 为啥不能写一个公用的方法呢 , 写一个抽象类, 供其他数据库连接池继承, 这样也就符合了C++的多态思想(这边纯属装个<B>, 高手请绕道)

思路介绍:

  1. 首先有连接池,必须先创造一个由若干个连接组成的连接池来管理, 并指定最大和最小连接数
  2. 连接池创造好了,当然要提供给外部获取和返还的方法
  3. 在外部调用过多时, 不够的需要创造新的, 这时候就会出现调用完成反还后面用不到, 连接池内部出现太多的空闲连接白消耗资源,这时候就需要管理者来管理这些冗余的连接
  4. 创造管理者子线程,用来定期监控空闲线程和定期清理那些未知原因导致的连接与数据库断开的连接

功能介绍:

1. 需要子类重写的受保护的纯虚函数(protected)

//创建一个连接:纯虚函数, 子类必须要实现
virtual void * createLink() = 0;
//销毁指定的连接:纯虚函数
virtual void v_destroyLink(void *link) = 0;
//检测连接是否可以用:通过一个不影响数据库的请求检测,比如Mysql的mysql_ping(MYSQL* con)
virtual bool isUsed(void *link) = 0;

[注意] 获得连接和反还连接用的都是void*, 此处是因为当前类为抽象类, 不是具体的数据库连接池, 所有的连接对象类型都未知, 调用如下:

//比如这是Redis的连接池伪代码
//实例继承连接池的Redis连接池对象
RedisPool redis;
//将获得的redis连接强转成Redis对象
Redis *red = (Redis*)redis.getLink();

2. 介绍公共成员函数

//构造函数
LinkPool();
//获得错误码
LinkPool::ErrOpt errNo();
//初始化连接池
//(minLinkNum:连接池最小连接数, maxLinkNum:连接池最大连接数,checkFreeLinkSecs:检查空闲链接秒数)
void createLinkPool(int minLinkNum, int maxLinkNum, int checkFreeLinkSecs = 10);
//销毁一个连接
void destroyLink(void *link);
//获得一个连接
void * getLink();
//返还一个连接到连接池
void backLink(void *link);
//销毁连接池:析构时自动调用
void destroyLinkPool();
//虚析构:目的是为了析构子类时,析构父类
virtual ~LinkPool();

3. 介绍私有成员变量

//线程锁:用来多线程操作的安全,使用静态方便调用
static pthread_rwlock_t *g_lock;
//连接池列表:当前连接池可用连接的链表
list<void*> m_linkList;
//忙碌的连接列表:已被取出的连接链表					
list<void*> m_busyLinkList;	
//最大连接数:连接池容纳的最大连接数			
int m_maxLinkNum = 0;
//最小连接数:连接池容纳的最小连接数					
int m_minLinkNum = 0;
//检查连接秒数:检查是否存在空闲连接的频率
int m_checkFreeLinkSecs = 0;
//存管理线程tid:管理者子线程id,用来销毁线程池时进行回收			
pthread_t m_adjust_tid;
//忙碌连接数:当前忙碌的连接数(已被取出的)
int m_busyLinkNum = 0;
//空闲链接数:当前空闲的连接数(未被取出的)
int m_freeLinkNum = 0;
//错误码:出错时进行赋值(枚举)					
LinkPool::ErrOpt m_errno;
//是否销毁:是否销毁,管理者线程执行无限循环的判断条件, 销毁则自动结束管理者线程	
bool m_isDestory = false;		

4. 错误类型

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值