当前位置: 首页 > 工具软件 > DBPool > 使用案例 >

TeamTalk DBPool详解

司寇凯
2023-12-01

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. 源码

 类似资料: