TeamTalk DBPool详解

1. 简介

这是一个基于Mysql实现的连接池。

2. 类与接口

CResultSet保存sql执行的结果集便于获取指定字段的值;
MYSQL_RES* m_res保存了sql执行的结果集,
m_key_map存储了结果集各个字段名和编号的映射关系,
MYSQL_ROW m_row存储了结果集某行信息;
_GetIndex从m_key_map获取指定字段名的编号,
Next()用于获取结果集下一行信息来更新m_row,
GetInt获取指定列名的值(数值型),
GetString获取指定列名的值(字符型)。

CPrepareStatement用MySQL的prepare statement接口来防止SQL注入
暂时只用于插入IMMessage表;
m_param_bind保存各个输入参数的属性,
m_param_cnt记录输入参数的个数;
Init用于创建mysql预编译语句并初始化m_param_bind,
SetParam重载了多个版本便于设置不同类型的输入参数,
ExecuteUpdate绑定输入参数并执行预编译语句,
GetInsertId返回执行INSERT或UPDATE自动生成的id(AUTO_INCREMENT)。

CDBConn用于处理mysql业务;
m_escape_string存储带特殊字符转义后的语句;
mysql_real_escape_string将带特殊字符的语句里特殊字符转义,存到m_escape_string,
ExecuteQuery执行sql语句并返回执行结果集,
ExecuteUpdate执行sql语句根据行rows affected情况返回执行成功或失败。

CDBPool构建mysql连接池分发和回收mysql连接;
m_db_cur_conn_cnt记录创建的连接数
m_free_list使用list<CDBConn*>保存各个mysql连接,
m_free_notify条件变量用于m_free_list生产消费的竞争问题;
Init创建指定数目的连接池并创建好每个池里的连接,
GetDBConn用于获取连接,若有空闲连接则分配出去,若没有判断已经创建的连接是否到达最大数目,若未达到直接创建一个并增加m_db_cur_conn_cnt,
RelDBConn回收连接,
~CDBPool销毁池里所有连接。

CDBManager管理mysql连接池;
s_db_manager单例,
m_dbpool_map建立名字和连接池的映射关系;
getInstance使用不加锁的懒汉模式创建单例,
Init根据配置调用CDBPool的Init创建出连接池,并初始化m_dbpool_map,
GetDBConn从m_dbpool_map里找到指定名字的连接池里获取一个空闲连接,调用了CDBPool的GetDBConn,
RelDBConn将连接归还到相应池子里,调用了CDBPool的RelDBConn。

3. mysql安装

apt-get -y install mysql-server
apt-get -y install mysql-client
apt-get -y install libmysqlclient-dev

4. test_dbpool.cpp说明

i: CDBPool析构会释放mysql连接池,但是连接池是通过指针存储的,动态内存需要手动释放,teamtalk未提供释放所有连接池的接口,因为所有连接池所有连接在服务器正常运行时都得重复使用
释放方法:遍历m_dbpool_map所有连接池,逐一delete

ii: mysql这里在程序退出前需调用mysql_server_end()不然会导致内存泄漏

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值