简单mysql连接池
来源:互联网 发布:sql server sum 函数 编辑:程序博客网 时间:2024/06/15 05:14
原文链接:http://blog.sina.com.cn/s/blog_49f761940100nv39.html
原文链接:
http://blog.csdn.net/midle110/article/details/19564463
版本一:
连接池为了解决频繁的创建、销毁所带来的系统开销。
简而言之,就是 自己先创建一定量的连接,然后在需要的时候取出一条连接使用。
当然如果你只有一个线程连接数据库,而且不是实时返回结果,那么你完全不必用连接池。
想一下网络大型游戏服务器,你就明白为什么需要连接池了。
自己敲代码写了一个简单的类,实现连接池,虽然没有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; //获取空闲线程
- };
- #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;
- }
- else
- return 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 );
- }
- else
- return 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;
- }
一、头文件【存为:connPool.h】
#ifndef __CONNECTION_POOL_H__
#define __CONNECTION_POOL_H__
#include "mutex.h"
#define
using namespace std;
enum _USE_STATUS
{
};
typedef
{
}sConStatus;
class CConnPool
{
public:
public:
public:
public:
};
class CConnPoolV2
{
public:
public:
private:
private:
};
#endif
二、源码【存为:connPool.cpp】
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <time.h>
#include <iostream>
#include <memory>
#include <string>
#include <map>
#include <vector>
#include "mysql.h"
#include "encapsulation_mysql.h"
#include "connPool.h"
#include "mutex.h"
using namespace std;
using namespace EncapMysql;
CConnPool::CConnPool( )
{
}
CConnPool::~CConnPool( )
{
}
void* CConnPool::createOneConn()
{
}
int CConnPool::Init(string& strMysqlIp, string&
{
}
//从连接池中取一个连接,同时,给它做一个标记,表明它已经被使用,防止别的线程再使用。
void* CConnPool::getOneConn()
{
}
//把连接归还给连接池。同时,给它做一个标记,表明它是空闲的,可以使用。
void
{
}
void
{
}
////////////////////////////// 2011-01-20, 这个类这样写,感觉耦合性更为松散,比较好。使用起来也好理解一些。
CConnPoolV2::CConnPoolV2( )
{
}
CConnPoolV2::~CConnPoolV2( )
{
}
//创建一个连接,并设为 IDLE状态。
void* CConnPoolV2::createOneConn()
{
}
//成功: 返回0
int CConnPoolV2::Init(string& strMysqlIp, string&
{
}
void* CConnPoolV2::getOneConn()
{
}
void
{
}
void
{
}
- 简单mysql连接池
- mysql c api简单连接池
- 简单JDBC连接mysql
- JAVA连接MySQL简单例子
- JDBC-简单的Mysql连接
- MySql连接数据库简单示例
- 简单测试连接mysql数据库
- 连接池连接mysql
- 简单的MySQL连接池,支持高并发。
- 【Swoole】用swoole简单实现MySQL连接池
- 连接mysql的javabean实例+简单分页
- 连接mysql的javabean实例+简单分页
- 连接mysql的javabean实例+简单分页
- 简单连接mysql,php语句手写
- PHP连接mysql的简单登录
- jsp连接mysql的简单实例
- 连接mysql的javabean实例+简单分页
- 《PHP---mysql数据连接简单示例》
- ubuntu14.04 安装eclipse的插件maven
- 引用数据类型的转换
- ngrok在linux和win下的使用
- Spring注解详解
- 九度题目1118数制转换
- 简单mysql连接池
- 在ZendStudio中增加新的php模板
- Java调用python,出现“无法解析的编译问题,PythonInterpreter无法解析为类型”
- Mybatis使用generator自动生成映射配置文件信息
- JVM工作原理
- Jenkins结合Docker在CentOS6.7上构建项目示例
- AC自动机总结
- SpringMVC中四个基本注解
- 设置GUI中Label的字体大小