首頁 資料庫 mysql教程 mysqlcapi简单连接池_MySQL

mysqlcapi简单连接池_MySQL

Jun 01, 2016 pm 01:19 PM
連接資料庫

bitsCN.com

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

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

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

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

自己敲代码写了一个简单的类,实现连接池,虽然没有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;	}	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;}
登入後複製
bitsCN.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用PHP讀取資料庫中的前幾筆記錄? 如何使用PHP讀取資料庫中的前幾筆記錄? Mar 22, 2024 am 10:03 AM

如何使用PHP讀取資料庫中的前幾筆記錄?在開發Web應用程式時,我們經常需要從資料庫中讀取資料並展示給使用者。有時候,我們只需要顯示資料庫中的前幾筆記錄,而不是全部。本文將教您如何使用PHP讀取資料庫中的前幾筆記錄,並提供具體的程式碼範例。首先,假設您已經連接到資料庫並選擇了要操作的表。以下為一個簡單的資料庫連接範例:

Java連接資料庫的SQLException異常該如何處理? Java連接資料庫的SQLException異常該如何處理? Jun 24, 2023 pm 09:23 PM

在Java程式中,連接資料庫是很常見的操作。雖然連接資料庫能夠使用現成的類別庫和工具,但在程式開發時仍然有可能出現各種異常情況,其中SQLException異常就是其中一種情況。 SQLException是Java提供的一個異常類,它描述了在存取資料庫時發生的錯誤,例如查詢語句錯誤、表不存在、連接中斷等。對於Java程式設計師來說,特別是那些使用JDBC(Java數

go語言怎麼連結資料庫 go語言怎麼連結資料庫 Dec 12, 2023 pm 03:51 PM

go語言透過匯入資料庫驅動、建立資料庫連線、執行SQL語句、使用預處理語句和事務處理等步驟來連接資料庫。詳細介紹:1、導入資料庫驅動,使用github.com/go-sql-driver/mysql包來連接MySQL資料庫;2、建立資料庫連接,提供資料庫的連接信息,包括資料庫的地址、使用者名稱、密碼等再透過sql.Open函數來建立資料庫連線等等。

利用Go語言連接資料庫:提高應用程式效能與效率 利用Go語言連接資料庫:提高應用程式效能與效率 Jan 23, 2024 am 08:57 AM

使用Go語言連接資料庫:提升應用程式的效能和效率隨著應用程式的發展和使用者量的增加,對資料的儲存和處理變得越來越重要。為了提高應用程式的效能和效率,合理地連接和操作資料庫是至關重要的一環。 Go語言作為一種快速、可靠、並發性強的開發語言,具有在處理資料庫時提供高效能效能的潛力。本文將介紹如何使用Go語言連接資料庫,並提供一些程式碼範例。安裝資料庫驅動程式在使用Go語

PHP實現商品庫存盤點的步驟與技巧 PHP實現商品庫存盤點的步驟與技巧 Aug 18, 2023 am 08:39 AM

PHP實現商品庫存盤點的步驟與技巧在電商產業,商品庫存管理是非常重要的一項工作。及時、準確地進行庫存盤點,可以避免因庫存錯誤導致的銷售延誤、客戶投訴等問題。本文將介紹如何使用PHP來實現商品庫存盤點的步驟與技巧,並提供程式碼範例。步驟一:建立資料庫首先,我們需要建立一個資料庫來儲存商品資訊。建立一個名為"inventory"的資料庫,然後建立一個名為"prod

入門Go語言:資料庫連線的基本概念 入門Go語言:資料庫連線的基本概念 Jan 23, 2024 am 08:17 AM

學習Go語言:連結資料庫的基礎知識,需要具體程式碼範例Go語言是一種開源的程式語言,其簡潔、高效的特性讓越來越多的開發者喜愛和使用。在開發過程中,經常需要與資料庫建立連接,進行資料的讀取、寫入、更新和刪除等操作。因此,學會如何在Go語言中連接資料庫是非常重要的技能。資料庫驅動在Go語言中,連接資料庫需要使用資料庫驅動程式。目前,Go語言的主要資料庫驅動有以

如何在Ubuntu系統上安裝配置PHP以連接MSSQL資料庫 如何在Ubuntu系統上安裝配置PHP以連接MSSQL資料庫 Feb 29, 2024 am 10:06 AM

在Ubuntu系統上安裝設定PHP以連接MSSQL資料庫是一項常見的任務,特別是在開發Web應用程式時。在本文中,我們將介紹如何在Ubuntu系統上安裝PHP、MSSQL擴充以及配置資料庫連接,同時提供具體的程式碼範例。步驟一:安裝PHP和MSSQL擴充安裝PHP首先,需要確保在Ubuntu系統上安裝了PHP。可以透過以下指令來安裝PHP:sudoaptu

MySQL的Jar套件有哪些重要功能? MySQL的Jar套件有哪些重要功能? Mar 01, 2024 pm 09:45 PM

標題:MySQL的Jar包有哪些重要功能? MySQL是一種流行的關聯式資料庫管理系統,許多Java開發人員在開發應用程式時都會使用MySQL資料庫。為了在Java專案中與MySQL資料庫進行交互,通常會使用MySQL提供的官方Java驅動程式Jar套件。 MySQL的Jar套件具有許多重要功能,本文將針對其中一些功能進行介紹,並提供具體的程式碼範例。 1.連接MyS

See all articles