C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...
在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接.
一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列.
当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队列,再用这个句柄做数据库操作,完毕后一定要从使用队列中删除,再插入到空闲队列.
代码如下:
MySQLMan.h
// MySQLMan.h: interface for the CMySQLMan class.
//
//
#include
#pragma comment(lib,"libmySQL.lib")
#include
typedef std::list CONNECTION_HANDLE_LIST;
typedef std::list::iterator ITER_CONNECTION_HANDLE_LIST;
#define CONNECTION_NUM 10 //同时打开的连接数
class CMySQLMan
{
public:
CMySQLMan();
CMySQLMan(const char *host, const char *user, const char *password, const char *db, unsigned int port=3306);
virtual ~CMySQLMan();
public:
bool ConnectDB(); //连接数据库
MYSQL_RES* SelectRecord(const char *szSql); //选择记录,返回结果集
bool SelectDB(const char *szDB); //选择数据库
bool UpdateRecord(const char *szSql); //更新记录
bool InsertRecord(const char *szSql); //插入记录
bool DelRecord(const char *szSql); //删除记录
BOOL IsEnd(MYSQL_RES *myquery); //是否最后
void SeekData(MYSQL_RES *myquery, int offset); //查找指定数据
void FreeRecord(MYSQL_RES *myquery); //释放结果集
unsigned int GetFieldNum(MYSQL_RES *myquery); //得到字段数
MYSQL_ROW GetRecord(MYSQL_RES *myquery); //得到结果(一个记录)
my_ulonglong GetRowNum(MYSQL_RES *myquery); //得到记录数
char* OutErrors(MYSQL* pMySql); //输出错误信息
char* GetState(); //服务器状态
char* GetServerInfo(); //服务器信息
int GetProtocolInfo(); //协议信息
char* GetHostInfo(); //主机信息
char* GetClientInfo(); //客户机信息
char* GetFieldName(MYSQL_RES *myquery, int FieldNum); //字段名
bool LockTable(const char *TableName, const char *Priority); //对特定表加锁
bool UnlockTable(); //解锁
bool SetCharset();
//int CreateDB(char *db); //创建数据库,返回错误信息
//int DropDB(char *db); //删除数据库,返回错误信息
MYSQL* GetIdleMySql(); //提取一个空闲句柄供使用
void SetIdleMysql(MYSQL* pMySql); //从使用队列中释放一个使用完毕的句柄,插入到空闲队列
public:
//MYSQL m_mysql; //数据库连接句柄
MYSQL_ROW m_row; //记录集(单行)
MYSQL_FIELD *m_field; //字段信息(结构体)
//创建两个队列
CONNECTION_HANDLE_LIST m_lsBusyList; //正在使用的连接句柄
CONNECTION_HANDLE_LIST m_lsIdleList; //未使用的连接句柄
CRITICAL_SECTION m_csList;
public:
char m_host[20]; //主机
char m_user[20]; //用户名
char m_password[20]; //密码
char m_db[20]; //数据库名
unsigned int m_port; //端口
};
MySQLMan.cpp
// MySQLMan.cpp: implementation of the MySQLMan class.
//
//
#include "StdAfx.h"
#include "MySQLMan.h"
//
// Construction/Destruction
//
CMySQLMan::CMySQLMan()
{
}
CMySQLMan::CMySQLMan(const char *host, const char *user, const char *password, const char *db, unsigned int port/* =3306 */)
{
strcpy(m_host, host);
strcpy(m_user, user);
strcpy(m_password, password);
strcpy(m_db, db);
m_port = port;
InitializeCriticalSection(&m_csList);
}
CMySQLMan::~CMySQLMan()
{
for (ITER_CONNECTION_HANDLE_LIST iter=m_lsBusyList.begin(); iter != m_lsBusyList.end(); iter++)
{
mysql_close((*iter));
}
for (ITER_CONNECTION_HANDLE_LIST iter=m_lsIdleList.begin(); iter != m_lsIdleList.end(); iter++)
{
mysql_close((*iter));
}
DeleteCriticalSection(&m_csList);
}
bool CMySQLMan::ConnectDB()
{
//同时打开CONNECTION_NUM个连接
try
{
for (int i=0; i
{
MYSQL *pMySql = mysql_init((MYSQL*)NULL);
if (pMySql != NULL)
{
if (!mysql_real_connect(pMySql,m_host,m_user,m_password,m_db,m_port,NULL,0))
{
OutErrors(pMySql);
return false;
}
m_lsIdleList.push_back(pMySql);
}
}
}
catch (...)
{
return false;
}
return true;
}
MYSQL* CMySQLMan::GetIdleMySql()
{
MYSQL* pMySql = NULL;
EnterCriticalSection(&m_csList);
if (m_lsIdleList.size() > 0)
{
pMySql = m_lsIdleList.front();
m_lsIdleList.pop_front();
m_lsBusyList.push_back(pMySql);
}
else
{
pMySql = NULL;
}
LeaveCriticalSection(&m_csList);
return pMySql;
}
void CMySQLMan::SetIdleMysql(MYSQL* pMySql)
{
EnterCriticalSection(&m_csList);
m_lsBusyList.remove(pMySql);
m_lsIdleList.push_back(pMySql);
LeaveCriticalSection(&m_csList);
}
MYSQL_RES* CMySQLMan::SelectRecord(const char *szSql)
{
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return NULL;
}
if(mysql_query(pMySql,szSql))
return NULL;
MYSQL_RES *myquery = NULL;
myquery = mysql_store_result(pMySql);
SetIdleMysql(pMySql);
return myquery;
}
bool CMySQLMan::InsertRecord(const char *szSql)
{
bool bRet = false;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if(mysql_query(pMySql,szSql))
{
bRet = true;
}
SetIdleMysql(pMySql);
return bRet;
}
bool CMySQLMan::UpdateRecord(const char *szSql)
{
bool bRet = false;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if(mysql_query(pMySql,szSql))
{
bRet = true;
}
SetIdleMysql(pMySql);
return bRet;
}
bool CMySQLMan::DelRecord(const char *szSql)
{
bool bRet = false;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if(mysql_query(pMySql,szSql))
{
bRet = true;
}
SetIdleMysql(pMySql);
return bRet;
}
bool CMySQLMan::SelectDB(const char *szDB)
{
bool bRet = false;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if (mysql_select_db(pMySql,szDB))
bRet = false;
else
bRet = true;
SetIdleMysql(pMySql);
return bRet;
}
my_ulonglong CMySQLMan::GetRowNum(MYSQL_RES *myquery)
{
return mysql_num_rows(myquery);
}
MYSQL_ROW CMySQLMan::GetRecord(MYSQL_RES *myquery)
{
m_row = mysql_fetch_row(myquery);
return m_row;
}
unsigned int CMySQLMan::GetFieldNum(MYSQL_RES *myquery)
{
return mysql_num_fields(myquery);
}
void CMySQLMan::FreeRecord(MYSQL_RES *myquery)
{
mysql_free_result(myquery);
}
//int CMySQLMan::CreateDB(char *db)
//{
// return mysql_create_db(&m_mysql,db);
//}
void CMySQLMan::SeekData(MYSQL_RES *myquery, int offset)
{
mysql_data_seek(myquery,offset);
}
char * CMySQLMan::OutErrors(MYSQL *pMySql)
{
return const_cast(mysql_error(pMySql));
}
BOOL CMySQLMan::IsEnd(MYSQL_RES *myquery)
{
return mysql_eof(myquery);
}
char* CMySQLMan::GetFieldName(MYSQL_RES *myquery, int FieldNum)
{
m_field = mysql_fetch_field_direct(myquery, FieldNum);
return m_field->name;
}
char * CMySQLMan::GetClientInfo()
{
return const_cast(mysql_get_client_info());
}
char* CMySQLMan::GetHostInfo()
{
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return NULL;
}
return const_cast(mysql_get_host_info(pMySql));
}
int CMySQLMan::GetProtocolInfo()
{
int iRet = 0;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return NULL;
}
iRet = mysql_get_proto_info(pMySql);
SetIdleMysql(pMySql);
return iRet;
}
char* CMySQLMan::GetServerInfo()
{
static char szRet[1024];
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return NULL;
}
_tcscpy(szRet, const_cast(mysql_get_server_info(pMySql)));
SetIdleMysql(pMySql);
return szRet;
}
char* CMySQLMan::GetState()
{
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return NULL;
}
static char szRet[1024];
_tcscpy(szRet,const_cast(mysql_stat(pMySql)));
SetIdleMysql(pMySql);
return szRet;
}
bool CMySQLMan::SetCharset()
{
bool bRet = false;
char szSql[50];
strcpy(szSql, "set names gb2312");
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if (mysql_query(pMySql, szSql))
bRet = true;
SetIdleMysql(pMySql);
return bRet;
}
//LOCK TABLES tbl1 READ, tbl2 WRITE
bool CMySQLMan::LockTable(const char *TableName, const char *Priority)
{
bool bRet = false;
char szSql[50];
sprintf(szSql, "LOCK TABLES %s %s", TableName, Priority);
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if (mysql_query(pMySql, szSql))
bRet = true;
SetIdleMysql(pMySql);
return bRet;
}
bool CMySQLMan::UnlockTable()
{
bool bRet = false;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if(mysql_query(pMySql,"UNLOCK TABLES"))
bRet = true;
SetIdleMysql(pMySql);
return bRet;
}
posted on 2008-02-21 15:10 水 阅读(4358) 评论(1) 编辑 收藏 引用 所属分类: socket编程
C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...相关推荐
- pythonscrapy爬虫ip代理池_在Scrapy中使用IP池或用户代理(python3)
一.创建Scrapy工程 1 scrapy startproject 工程名 二.进入工程目录,根据爬虫模板生成爬虫文件 1 scrapy genspider -l # 查看可用模板2 scrapy ...
- mysql连接池_基于Swoole的通用连接池 - 数据库连接池(life)
open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖版本PHP>=7.0.0Swoole>=4.2.9Recommend ...
- swoole mysql 连接池_基于Swoole的通用连接池 - 数据库连接池
连接池 open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖 版本 >=7.0.0 >=4.2.9 Recommend ...
- 360mysql连接池_自己动手写个数据库连接池
说到数据库连接池也是初学者会望而却步,认为是如何高深莫测的东西,其实可以用一句话来解释: 连接池的出现是为了用户频繁访问数据库而造成速度和性能上的迟缓才对访问数据库的方法作了一点修改,这个修改就是把原 ...
- mysql版本链图解_图解 SQL 中各种连接 JOIN
先用文字来捋一下思路,数据库操作中无非就是「增删查改」,其中「 查」用得最多且最复杂,变化多端.查询的时候,我们可以只是单表查询,也可以是多表连接查询,单表查询中的学问也很大,但限于篇幅,本次主要分享 ...
- mysql左连接含义_学习笔记-数据库左连接,右连接意义及区别
1.左连接,右连接等的意义及区别: 1)笛卡尔积:CROSS JOIN 要理解各种JOIN首先要理解笛卡尔积.笛卡尔积就是将A表的每一条记录与B表的每一条记录强行拼在一起. 所以,如果A表有n条记录, ...
- python 数据库连接池_【转】Python 数据库连接池
python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响.因 ...
- fastreport.net 交叉表居中显示_浅析Sql中内连接、外连接、全连接、交叉连接的区别...
外连接(out join) 外连接分为外左连接(left outer join)和外右连接(right outer join) 注释:left outer join 与 left join 等价, 一 ...
- inner join on 加条件和where加条件_图解 SQL 中各种连接 JOIN
先用文字来捋一下思路,数据库操作中无非就是「 增删查改 」,其中「 查」用得最多且最复杂,变化多端.查询的时候,我们可以只是单表查询,也可以是多表连接查询,单表查询中的学问也很大,但限于篇幅,本次主要 ...
最新文章
- 批量 材质 调整_SMT打样小批量加工中的助焊剂是什么
- iOS 设计模式浅析 1 - 策略
- 图神经网络的表达能力,究竟有多强大?
- mysql主从复制实战
- SQL 2008中修改表结构提示“阻止保存要求重新创建表的更改”
- h5列表 php,常用的HTML5列表标签
- linux的open的非组赛,Linux下的非阻塞IO库epoll
- iOS开发UI篇—实现一个私人通讯录小应用(二)
- 工作292:修改父子组件传值错误
- 根据Web服务器的记录来追踪黑客(转)
- 腾讯云安全组规则导出
- (机器学习/计算机视觉/深度学习)代码
- 小猿圈python学习-函数的递归
- 【Qt教程】3.5 - Qt5 QPainter绘图抗锯齿、相对坐标/平移坐标系、QPainter画图片、手动调用QPainter绘图事件
- 微信开发者工具打开导入其他人的项目源码 修改appid
- html rfftq15.gif,stm32f4中用SD卡存储DCMI的图像
- enum ordinal java_Java Enum ordinal()方法
- 软件测试方法_边界值分析法
- 新疆大盘鸡的标准做法
- 基于 MATLAB fitcsvm 的 OVR SVM 多分类器实现
热门文章
- saltsack之数据系统(三)
- Simple2D-15(音乐播放器)使用 glfw 库
- PHP 显示信息到控制台console
- 考研计算机网络,2020计算机专业考研的计算机网络部分知识点
- 题目管理后台系统_中后台产品最爱的后台:CMS(社区)管理系统搭建
- 全年营业额怎么计算_超全!各种税种计算公式!你一定要知道
- cpu使用率_线程CPU使用率到底该如何计算?
- u8转完看不到菜单_填制凭证界面上的菜单看不见
- python程序如何做界面_如何用Python给已有小程序做界面?
- mysql的count函数类型是什么意思_详细解读MySQL中COUNT函数的用法