连接池为了解决频繁的创建、销毁所带来的系统开销。

简而言之,就是 自己先创建一定量的连接,然后在需要的时候取出一条连接使用。

当然如果你只有一个线程连接数据库,而且不是实时返回结果,那么你完全不必用连接池。

想一下网络大型游戏服务器,你就明白为什么需要连接池了。

自己敲代码写了一个简单的类,实现连接池,虽然没有mysql++那么强大,但是还是自己有收获。

Csqlpool.h 头文件实现如下:

#pragma once
#include <WinSock2.h>
#include <mysql.h>
#include <list>#pragma comment( lib , "libmysql.lib" )using namespace std;class Csqlpool
{
public:~Csqlpool(void);static Csqlpool *GetSqlPool();bool IniSqlPool( const char *host , const char *name , const char *pwd , unsigned int port , unsigned int conMax );  //初始化连接池bool SelectDB( MYSQL *sql, const char *DB);   //选择数据库MYSQL *GetConnect();          // 获取连接void RelConnect(MYSQL *sql) ;  // 释放连接MYSQL_RES* GetQuery( MYSQL *sql , const char *query);      //mysql操作  增删查改void RelQuery(MYSQL_RES *res);   //释放MYSQL_RES资源bool Query(MYSQL *sql , const char *query);  //增、删、改操作protected:Csqlpool(void);
private:list<MYSQL *> m_sql_free;   //空闲连接     static Csqlpool *pSqlPool;      CRITICAL_SECTION m_session;    //获取空闲线程
};

Csqlpool.cpp 实现如下:

#include "StdAfx.h"
#include "Csqlpool.h"Csqlpool *Csqlpool::pSqlPool = NULL;Csqlpool::Csqlpool(void)
{InitializeCriticalSection( &m_session );
}Csqlpool::~Csqlpool(void)
{while ( m_sql_free.size() ){mysql_close( m_sql_free.front() );m_sql_free.pop_front();}DeleteCriticalSection(&m_session);
}Csqlpool* Csqlpool::GetSqlPool()
{if (  pSqlPool == NULL ){return new Csqlpool;}return pSqlPool;
}bool Csqlpool::IniSqlPool( const char *host ,const char *name , const char *pwd , unsigned int port , unsigned int conMax )  //初始化连接池
{int nsum = 0 ;for (unsigned int i = 0 ; i < conMax ;++i  ){MYSQL *pmysql;pmysql = mysql_init( (MYSQL*)NULL );if ( pmysql != NULL ){if ( mysql_real_connect( pmysql , host , name , pwd , NULL , 3306 , NULL , 0 ) ){m_sql_free.push_back(pmysql);}else{if ( nsum++ == 100 ){return false;}continue;}}continue;}return true;
}bool Csqlpool::SelectDB( MYSQL *sql, const char *DB)   //选择数据库
{if(mysql_select_db(sql , DB)){return false;}return true;
}MYSQL* Csqlpool::GetConnect()          // 获取连接
{if ( m_sql_free.size()  ){EnterCriticalSection(&m_session);MYSQL *mysql = m_sql_free.front();m_sql_free.pop_front();LeaveCriticalSection(&m_session);return mysql;}elsereturn NULL;
}void Csqlpool::RelConnect(MYSQL *sql)  // 释放连接
{EnterCriticalSection(&m_session);m_sql_free.push_back(sql);LeaveCriticalSection(&m_session);
}MYSQL_RES* Csqlpool::GetQuery( MYSQL *sql , const char *query)         //查询操作
{if ( mysql_query( sql , query ) == 0 ){return mysql_store_result( sql );}elsereturn NULL;
}void Csqlpool::RelQuery(MYSQL_RES *res)   //mysql_res release
{mysql_free_result(res);
}bool Csqlpool::Query(MYSQL *sql , const char *query)  //增、删、改操作
{if ( mysql_query( sql , query ) ){return false;}return true;
}

testsqlpool.cpp 测试文件实现如下:

// testsqlpool.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "Csqlpool.h"
#include <iostream>using namespace std;Csqlpool *psql = Csqlpool::GetSqlPool();DWORD WINAPI ThreadProc( LPVOID lpParameter);int _tmain(int argc, _TCHAR* argv[])
{if(!psql->IniSqlPool("127.0.0.1" , "root" ,"123",3306,10)){cout<<"连接错误"<<endl;}HANDLE phan[2] ;DWORD threadid[2];int n1 = 0, n2 = 100;;phan[0]  = CreateThread( NULL , 0 ,  ThreadProc , &n1 ,  0 , &threadid[0] );phan[1]  = CreateThread( NULL , 0 , ThreadProc , &n2 ,   0 , &threadid[1] );WaitForMultipleObjects( 2 , phan , true ,  INFINITE );CloseHandle(phan[0]);CloseHandle(phan[1]);return 0;
}DWORD WINAPI ThreadProc( LPVOID lpParameter)
{int index = *(int *)lpParameter ;int i = 1; MYSQL *sql = psql->GetConnect();string stemp = "insert into actor( actor_id , first_name , last_name,last_update )values(\"";string strsql;char str[10];if ( psql->SelectDB(sql , "sakila") ){  while ( i != 100 ){sprintf( str , "%d" , i+index );strsql = stemp ;strsql +=  str;strsql += "\",\"0\",\"0\",\"0\")";if(!sql)return 0;if(!psql->Query(  sql ,strsql.c_str()  )){cout<<"add false"<<endl;}++i;}psql->RelConnect(sql);}return 0;
}

mysql c api简单连接池相关推荐

  1. 微服务 mysql 连接池_【mysql】druid,连接池和微服务的问题

    我所知道的 druid 配置,是在一个服务上进行配置 假如一台机器上装有 mysql 当我们用连接池去连接的时候 根据 https://blog.csdn.net/w059805- 说法 连接池的大小 ...

  2. mysql多个字符串连接池_使用Coroutine\Channel实现一个简单的MySQL连接池

    Channel通道,类似于go语言的chan,支持多生产者协程和多消费者协程,Swoole底层自动实现了协程的切换和调度 Channel实现原理 通道与PHP的Array类似,仅占用内存,没有其他额外 ...

  3. spring-boot配置MySQL数据库连接、Hikari连接池、和Mybatis的简单方法

    此方法为极简配置,支持MySQL数据库多库连接.支持Hikari连接池.支持MyBatis(包括Dao类和xml文件位置的配置). 如果需要更灵活的自定义配置(比如支持分页插件),请参考:http:/ ...

  4. golang mysql断线_MySQL的连接池、异步、断线重连-Go语言中文社区

    MySQL长连接 MySQL短连接每次请求操作数据库都需要建立与MySQL服务器建立TCP连接,这是需要时间开销的.TCP连接需要3次网络通信.这样就增加了一定的延时和额外的IO消耗.请求结束后会关闭 ...

  5. dbcp连接池配置详解_重学MySQL:事务与连接池,一文详解带你搞懂

    拼多多三面惨败,java中间件.数据库与spring框架,答不上... 吊打MySQL:21性能优化实践+学习导图+55面试+笔记+20高频知识点 Mysql事务 事务: 事务指逻辑上的一组操作,组成 ...

  6. mysql api是什么意思_什么是mysql c api? 解析mysql c api简单应用

    在学习数据库的时候,我们需要了解一些简单的应用,比如mysql api简单应用,喜欢的小伙伴们可以看一下.#include #include #include "mysql.h" ...

  7. 自己写的grpc简单连接池,基于common pool2

    17年的时候写的证券的项目,当时交易端是另外一批同事开发的,他们强烈要求用grpc,当时这个东西还不那么成熟,在网上也搜索不到比较完美的第三方的连接池搭配使用,索性就自己写了一个,因为之前thrift ...

  8. Linux下MySQL C API简单示例

    2019独角兽企业重金招聘Python工程师标准>>> 1. 创建数据库 drop database testdb; commit;create database testdb; c ...

  9. 【SSM面向CRUD编程专栏 2】Spring相关API 数据源(连接池)的配置 注解开发 整合junit

最新文章

  1. AI一分钟 | 美女机器人竟然想生孩子,太可怕了!比尔·盖茨当选中国工程院外籍院士
  2. 在Python中计算一次性计算多个百分位数percentile、quantile
  3. linux ls模糊查询,linux – 找到和ls的通配符
  4. IPFS: NAT traversal(NAT穿越)
  5. 如何画出几种常见二分类损失函数(附代码)
  6. SAP OData编程指南
  7. 小程序添加和删除新元素功能实例
  8. 使用Hanlp加载大字典
  9. 去掉知乎/CSDN网页标题未读消息提示
  10. php的闭包函数bingto_php的闭包
  11. button执行onclick函数_【JavaScript】函数
  12. phonegap 总结
  13. 新疆财大计算机科学,新疆财经大学计算机科学与工程学院学生参加了多项专业赛事...
  14. 0016_光源和打光(1)
  15. 如何用matlab画一个球
  16. 游戏引擎架构----动画
  17. 好的设计的10个原则
  18. Layer.js实现表格溢出内容省略号显示,悬停显示全部
  19. 量子通信,永不陷落的安全堡垒?
  20. 湖南计算机前十大学,湖南计算机专业学校排名

热门文章

  1. python什么是堆什么是栈_顶置篇:CPython的内存概念:栈、堆和引用
  2. tplinkl路由器跨vlan访问_路由器与三层交换机的区别:谁才是最好的选择?
  3. 素数环(nyoj488)
  4. Python基础——字符串、列表、元组
  5. keras笔记-模型保存以及tensorboard的使用
  6. 吴恩达深度学习2.1笔记_Improving Deep Neural Networks_深度学习的实践层面
  7. 微服务部署:蓝绿部署、滚动部署、灰度发布
  8. gfirefly 框架分析
  9. liveness 生存性/活性
  10. 你以为PHP那么好自定义升级?