mysql连接池搭的api_mysql c api简单连接池

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

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

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

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

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

Csqlpool.h 头文件实现如下:

#pragma once

#include

#include

#include

#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 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;

}

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

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<

}

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<

}

++i;

}

psql->RelConnect(sql);

}

return 0;

}

原文:http://blog.csdn.net/midle110/article/details/19564463

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当数据库中的多个事务相互等待对方释放锁时,就会发生死锁。这种情况下,数据库无法自行解决死锁问题,需要人工介入。以下是一些可能导致死锁的原因: 1. 事务中操作的顺序不同导致的死锁。比如,事务A先申请锁1再申请锁2,而事务B则先申请锁2再申请锁1,这种情况下就可能出现死锁。 2. 事务中锁的粒度过大导致的死锁。如果事务A和事务B都需要锁住同一个表,那么当两个事务同时执行时就会发生死锁。 3. 数据库中的资源不足导致的死锁。比如,连接池满了,没有可用的连接了,那么新的事务就无法执行,从而导致死锁。 针对中间件连接池满的故障诊断,可以通过以下步骤进行: 1. 检查数据库是否存在死锁。可以通过查询数据库日志或使用工具检查数据库状态来判断是否存在死锁。 2. 检查中间件连接池的配置。检查连接池的最大连接数、空闲连接数等配置是否合理。如果连接池的配置不合理,可以调整配置来解决问题。 3. 检查中间件连接池的使用情况。使用工具检查连接池的使用情况,查看连接池是否被占满,是否存在长时间空闲的连接等情况。 4. 检查数据库服务器的负载情况。如果数据库服务器的负载过高,也会导致连接池满的问题,因此需要检查数据库服务器的负载情况。 根据以上步骤,可以快速定位中间件连接池满的故障原因,并采取相应的措施来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值