91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| #pragma once
 | ||
| #ifndef CCONNECT_POOL_H_2021
 | ||
| #define CCONNECT_POOL_H_2021
 | ||
| 
 | ||
| #include <stdio.h>
 | ||
| #include <stdlib.h>
 | ||
| #include <queue>
 | ||
| #include <set>
 | ||
| #include <pthread.h>
 | ||
| #include <unistd.h>
 | ||
| #include "mysql/mysql.h"
 | ||
| 
 | ||
| class CConnectPool
 | ||
| {
 | ||
| public:
 | ||
|     struct Connect_Info
 | ||
|     {
 | ||
|         int MinConnectCount;
 | ||
|         int MaxConnectCount;
 | ||
|         const char *Host;
 | ||
|         int Port;
 | ||
|         const char *Account;
 | ||
|         const char *Passwd;
 | ||
|         const char* KName;
 | ||
|     };
 | ||
| 
 | ||
|     Connect_Info My_Info;
 | ||
| 
 | ||
| public:
 | ||
|     /**
 | ||
|      * @brief 创建连接池 \n
 | ||
|      * 在主线程中创建连接池,创建后需要调用FreePool予以释放
 | ||
|      * 创建失败程序会打印错误信息并终止运行
 | ||
|      */
 | ||
|     static void
 | ||
|     CreatePool(int MinConnectCount, int MaxConnectCount, const char *Host, int Port, const char *Account, const char *Passwd);
 | ||
| 
 | ||
|     /**
 | ||
|      * @brief 释放连接池 \n
 | ||
|      * 需要在主线程中调用该接口
 | ||
|      */
 | ||
|     static void FreePool();
 | ||
| 
 | ||
|     /**
 | ||
|      * @brief 获取连接 \n
 | ||
|      * 支持多线程,使用完成后需调用PutConnect,归还连接,本函数为阻塞函数,直到有可用连接才调用返回
 | ||
|      * @return 返回数据库连接
 | ||
|      *  --NULL表示调用失败
 | ||
|      */
 | ||
|     static MYSQL *GetConnect();
 | ||
| 
 | ||
|     /**
 | ||
|      * @brief 获取连接 \n
 | ||
|      * 支持多线程,使用完成后需调用PutConnect,归还连接,本函数调用后立刻返回,若没有空闲连接则返回NULL
 | ||
|      * @return 返回数据库连接
 | ||
|      *  --NULL表示调用失败
 | ||
|      * */
 | ||
|     static MYSQL *TryGetConnect();
 | ||
| 
 | ||
|     /**
 | ||
|      * @brief 向连接池归还连接 \n
 | ||
|      * 支持多线程
 | ||
|      * @param[in] pConn    需要归还的数据库连接
 | ||
|      * */
 | ||
|     static void PutConnect(MYSQL *pConn);
 | ||
| 
 | ||
| private:
 | ||
|     CConnectPool();
 | ||
|     ~CConnectPool();
 | ||
|     MYSQL *_GetConnect(bool bTry);
 | ||
|     void _PutConnect(MYSQL *pConn);
 | ||
|     // 真正创建连接
 | ||
|     MYSQL *_CreateConnect();
 | ||
| 
 | ||
|     static CConnectPool *s_pInstance;
 | ||
|     std::queue<MYSQL *> m_queueFree; // 空闲队列
 | ||
|     std::set<MYSQL *> m_setBusy;     // 繁忙队列
 | ||
|     pthread_mutex_t m_mutex;
 | ||
|     pthread_cond_t m_cond;
 | ||
| };
 | ||
| 
 | ||
| #endif
 | ||
| 
 | ||
| /*
 | ||
| 使用说明
 | ||
| CConnectPool::CreatePool();
 | ||
| MYSQL *sql = CConnectPool::GetConnect();
 | ||
| CConnectPool::PutConnect(sql);
 | ||
| CConnectPool::FreePool();
 | ||
| */
 |