Mysqlyy.cpp文件主要实现 mysql数据库连接池。

自己实现了mysql连接池之后,发现连接池就那么回事。系统一开始就申请一大堆东西在那里放着,等着你来用,省的你需要的时候申请,使用完之后又要释放的麻烦。

这里面没有使用内存池,如果一个服务器不是用内存池跑几个月是不是极限了?记得我大二的时候写屏幕实时显示的程序,没用内存池,跑了半个小时就挂掉了。

当然现在有了tcmalloc这等高富帅的神器,程序肯定会瞬间高档一个档次。

下面是Mysqlyy.cpp文件加我的注释

#include "StdAfx.h"
#include ".\mysqlyy.h"#include "..\unicode.h"#include "../../include/zdebug.h"#include "H:\SYMobilePalaza\trunk\src\Core\NetCore_DLL\libiconvDLL\src\convert.h"//stl find
#include <algorithm>CYYMysql::CYYMysql(void)
{
}CYYMysql::~CYYMysql(void)
{
}bool CYYMysql::Initialize(const char* Hostname, unsigned int port,const char* Username, const char* Password, const char* DatabaseName,int ConnectionCount,int JobCount)          //初始化mysql连接池
{if (1){char *tmp = "斗地主1";char out[64]={'\0'};if (CLibiconv::code_convert("gbk","utf-8",tmp,strlen(tmp)*2+1,out,64)>=0){printf("test=%s\n",out);//Debug("%s",out);}else{printf("1 conver err\n");}char out2[64]={'\0'};if (CLibiconv::code_convert("utf-8","gbk",out,strlen(out),out2,64)>=0){printf("test=%s\n",out2);//Debug("%s",out2);}else{printf("2 conver err\n");}//return true;}my_bool my_true = true;for (int i=0;i<ConnectionCount;i++){CYYMySqlCon *temp = new CYYMySqlCon;temp->_sql = mysql_init(NULL);if (!temp->_sql){continue;}if(!mysql_real_connect(temp->_sql,Hostname,Username,Password,DatabaseName,port,NULL,0)){printf("数据库连接失败,原因如下: %s\n",mysql_error(temp->_sql));return false;}if (!temp->_sql){//errmysql_close(temp->_sql);delete temp;temp = NULL;return false;}if(mysql_set_character_set(temp->_sql,"latin1"))//utf8,GBK{printf("字符集设置失败\n");return false;}m_FreeList.push_back(temp);}for (int i=0;i<JobCount;i++){CYYJob * job = new CYYJob;m_FreeJobList.push_back(job);}return true;
}CYYMySqlCon * CYYMysql::GetFreeCon()              //获取空闲连接
{CAutoLock lock(&m_SqlPoolLock);if (!m_FreeList.empty()){CYYMySqlCon * temp = m_FreeList.front();m_BusyList.push_back(temp);m_FreeList.pop_front();return temp;}return NULL;
}void CYYMysql::ReleaseCon(CYYMySqlCon*con)           //释放已经使用过的连接
{                       //我觉得只需要维持一个free list就行了,程序结束的时候只需要释放free listCAutoLock lock(&m_SqlPoolLock);                if (!con){//errreturn;}m_FreeList.push_back(con);YYMySqlConListIt iter = find(m_BusyList.begin(),m_BusyList.end(),con);if (iter!=m_BusyList.end()){m_BusyList.erase(iter);}else{//err}
}CYYJob * CYYMysql::GetFreeJob(char *query)
{CAutoLock lock(&m_jobPoolLock);CYYJob * job = NULL;if (m_FreeJobList.empty()){job = new CYYJob;job->_con = GetFreeCon();                               //当请求很多的时候 超过了mysql连接的最大数,这不是就失败了吗?//为什么不使用一个线程使用一个固定的mysql连接?if (!job->_con){return NULL;}sprintf(job->_query,query);m_BusyJobList.push_back(job);return job;}else{job = m_FreeJobList.front();job->_con = GetFreeCon();sprintf(job->_query,query);m_BusyJobList.push_back(job);m_FreeJobList.pop_front();return job;}return NULL;
}void CYYMysql::ReleaseJob(CYYJob*job)
{CAutoLock lock(&m_jobPoolLock);if (!job){//errreturn;}m_FreeJobList.push_back(job);YYJobListIt iter = find(m_BusyJobList.begin(),m_BusyJobList.end(),job);if (iter!=m_BusyJobList.end()){m_BusyJobList.erase(iter);}else{//err}
}void CYYMysql::Start()
{SYSTEM_INFO si;GetSystemInfo(&si);int processNum = si.dwNumberOfProcessors;       //获取cpu核数processNum = (processNum == 1) ? 2:processNum;m_ThreadPool.Start(processNum,processNum + 1);        //启动线程池 ,但是网上的经验规则iocp线程数在2n+2比较好
}void CYYMysql::Stop()
{m_ThreadPool.Stop();
}void CYYMysql::ExecuteQueryNoRet(char *query)
{static CYYWorker * worker = new CYYWorker(this);CYYJob * job = GetFreeJob(query);m_ThreadPool.ProcessJob(job,worker);
}bool CYYMysql::SelectDB(CYYMySqlCon*con,char *db)             //选择数据库
{if (con && con->_sql){if(mysql_select_db(con->_sql,db)==0){return true;}}return false;
}bool CYYMysql::Query(CYYMySqlCon*con,char*cmd,MYSQL_RES *res)       //查询请求
{if (con && con->_sql){if (mysql_real_query(con->_sql,cmd,strlen(cmd))==0){if(mysql_field_count(con->_sql) > 0){res = mysql_store_result(con->_sql);if (res){return true;}}}}return false;
}bool CYYMysql::Query(char*cmd,MySqlResultList *data)        //增删改请求
{CYYMySqlCon*con = GetFreeCon();                       //con没有回收MYSQL_RES * res = NULL;if (con && con->_sql){if (mysql_real_query(con->_sql,cmd,strlen(cmd))==0){if(mysql_field_count(con->_sql) > 0){res = mysql_store_result(con->_sql);if (res){int rows = mysql_num_rows(res);int fields = mysql_num_fields(res);MYSQL_FIELD * fd;char keyName[32][32]={'\0'};for(int i=0;fd = mysql_fetch_field(res);i++){strcpy(keyName[i],fd->name);}for (int i=0;i<rows;i++)               //结果存储{MYSQL_ROW row = mysql_fetch_row(res);unsigned long *lengths = mysql_fetch_lengths(res);for (int j=0;j<fields;j++){CMySqlResult tmp;memcpy(tmp._name,keyName[j],strlen(keyName[j])*2+1);memcpy(tmp._data,row[j],strlen(row[j])*2+1);tmp._fields = j;data->push_back(tmp);}}mysql_free_result(res);//结果集释放return true;}}}}return false;
}bool CYYMysql::GetFirstRow(CYYMySqlCon*con,char*cmd,MYSQL_ROW &row)
{MYSQL_RES *res;if (Query(con,cmd,res)==true){row = mysql_fetch_row(res);if (row){return true;}}return false;
}//
void CYYWorker::ProcessJob(IJobDesc* pJob)
{CYYJob * job = (CYYJob*)pJob;MYSQL_RES res;this->_mysql->Query(job->_con,job->_query,&res);
}

CYYMysql 源码解读 3相关推荐

  1. CYYMysql 源码解读 4

    ThreadPool.cpp文件主要是实现线程池,线程池和内存池以及连接池原理都是差不多,一开始申请好了然后需要的时候自己调用就行了. 下面是源码和注释: #include "stdafx. ...

  2. CYYMysql 源码解读 1

    1.unicode.h 文件里面主要是不同字符编码之间的转换.主要是使用这两个函数:MultiByteToWideChar(),WideCharToMultiByte(). 2.common.h文件 ...

  3. CYYMysql 源码解读 2

    线程同步类 Lock.h文件和Lock.cpp文件实现比较简单,使用的是临界区,临界区是用户态的线程间切换消耗不是很大,而事件内核对象.信号量.互斥量都是内核态的,调用的时候会切换到内核态,所以尽量使 ...

  4. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

  5. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  6. linux下free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  7. nodeJS之eventproxy源码解读

    1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...

  8. PyTorch 源码解读之即时编译篇

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 作者丨OpenMMLab 来源丨https://zhuanlan.zhihu.com/ ...

  9. Alamofire源码解读系列(九)之响应封装(Response)

    本篇主要带来Alamofire中Response的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些顶级框架在设计和编码层次究竟有哪些过人的地方?当然, ...

最新文章

  1. 【算法笔记】一步一步推出来的同余最短路优化思路(千字长文,超详细)
  2. 【Java8新特性】关于Java8的Stream API,看这一篇就够了!!
  3. 基于经典的机器学习k-means聚类算法实现对三通道图片的压缩操作
  4. mysql 备份 第三方工具_Mysql第三方备份工具Xtrabackup使用说明
  5. Matlab R2018a版离线使用帮助文档方法
  6. POJ 3061 -- Subsequence(二分)
  7. 阻塞队列-BlockningQueue
  8. 【Java】浅谈Java的GUI开发
  9. Android服务函数远程调用源码分析
  10. 实施IT运维管理 循序渐进
  11. Apache Server Status主机状态查看
  12. 获取Repeater中Footer/HeaderTemplate 中的控件
  13. springboot配置微信公众号获取openid
  14. Python爬虫编程思想(92):项目实战:抓取京东图书评价
  15. 如何用计算机表达无理数,利用泰勒级数计算无理数和以及其他任意无理数的近似值.doc...
  16. Delphi 生成二维码【PaintBox】并保存为本地文件添加至【Image】控件中
  17. 电脑专业英语1695词
  18. Windows CMD命令添加开机启动项
  19. 第七章-复用类-继承语法-1
  20. leetcode 前缀树

热门文章

  1. mysql去重的最方便的两种方法_mysql去重的最方便的两种方法
  2. HDU-简易版之最短距离(最短路)
  3. linux虚拟文件系统(六)-文件关闭操作分析
  4. Hadoop系列之OutputCollector
  5. 毕设日志——tensorboardX无法连接的问题
  6. 高仿富途牛牛-组件化(五)-如何去管理炒鸡多的小窗口
  7. BZOJ1257:[CQOI2007]余数之和(整除分块)
  8. 解决Maven的Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
  9. SDN时代更需要有保障的网络
  10. iOS10 CAAnimationDelegate适配引申到条件编译