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();
|
||
*/
|