240717班级,工业化控制系统,煤矿相关行业,昆仑系统
1
wangky
2024-11-07 951c1d946422a5b3be42d2d0710590fa80e14de4
Server/ÍõçûÔª/code/ConnectionPool.h
@@ -1,54 +1,44 @@
#pragma once
#include "MysqlConn.h"
#include "./tinyxml/tinyxml.h"
#include <queue>
#include <mutex>
#include <thread>
#include <atomic>
#include <condition_variable>
#pragma comment(lib, "./tinyxml/x64/Debug/tinyxml.lib")
// åº”用-单例模式:懒汉模式[需要考虑多线程安全问题]
class ConnectionPool
{
private:
   ConnectionPool();
   // ç§»åŠ¨æ‹·è´æœ€ç»ˆè¿˜æ˜¯æœ‰ä¸”ä»…æœ‰ä¸€ä¸ªå¯¹è±¡ï¼Œæ‰€ä»¥ä¾æ—§æ˜¯å±žäºŽå•ä¾‹æ¨¡å¼ã€‚
   // delete é˜»æ­¢æ‹·è´æž„造和拷贝赋值的类对象生成
   ConnectionPool(ConnectionPool&) = delete;
   ConnectionPool& operator=(ConnectionPool&) = delete;
   ~ConnectionPool();
   // è§£æžxml配置文件 è¯»å–数据库及连接池的相关信息
   bool parseXmlFile();
   // æ·»åŠ è¿žæŽ¥
   bool addConnection();
   // çº¿ç¨‹å‡½æ•°
   void productConnection();
   void recycleConnection();
   // å­˜æ”¾æ•°æ®åº“连接池建立的连接
   queue<MysqlConn*>   m_connections;
   // ä¸€äº›åŸºæœ¬ä¿¡æ¯
   string            m_ip;         // IP
   unsigned short      m_port;         // ç«¯å£
   string            m_user;         // ç”¨æˆ·å
   string            m_passwd;      // å¯†ç 
   string            m_dbName;      // æ•°æ®åº“名称
   int               m_minSize;      // åˆå§‹è¿žæŽ¥é‡(最小连接量)
   int               m_maxSize;      // æœ€å¤§è¿žæŽ¥é‡
   int               m_timeout;      // è¶…æ—¶æ—¶é•¿
   int               m_maxIdleTime;   // æœ€å¤§ç©ºé—²æ—¶é•¿
                              // çº¿ç¨‹å®‰å…¨ç›¸å…³
   mutex            m_mutex;
   condition_variable   m_cond;         // ä»…用一个条件变量来唤醒线程,但并不影响线程运行
   condition_variable  m_cond1;
   // è¿žæŽ¥æ•°é‡
   atomic_int         m_num;         // è¿žæŽ¥çš„æ€»æ•°é‡
public:
   // èŽ·å–å•ä¾‹å¯¹è±¡çš„æŽ¥å£
   static ConnectionPool* getConnectPool();
   // ç”¨æˆ·èŽ·å–è¿žæŽ¥çš„æŽ¥å£, å¦‚果获取失败,会返回nullptr
   shared_ptr<MysqlConn> getConnection();
    static ConnectionPool* getInstance();
    shared_ptr<MysqlConn> getMysqlConn();    // ä»Žæ•°æ®åº“连接池获取连接
    ConnectionPool(const ConnectionPool& other) = delete;
    ConnectionPool& operator=(const ConnectionPool& other) = delete;
    ~ConnectionPool();
    void description();
protected:
    ConnectionPool();   // æž„造函数
private:
    // ä¸å†éœ€è¦è§£æžé…ç½®æ–‡ä»¶çš„函数
    // bool parseJsonFile();   // è§£æžé…ç½®
    void produce();
    void recycle();
    void addConnection();  // å¢žåŠ è¿žæŽ¥æ•°
    // å†™æ­»çš„æ•°æ®åº“连接参数
    string m_ip = "127.0.0.1";
    string m_userName = "root";
    string m_passwd = "123456";
    string m_db = "mayi_kunlun";
    unsigned short m_port = 3306;
    int m_max_conn;
    int m_min_conn;
    int m_timeout;      // è¿žæŽ¥è¶…æ—¶æ—¶é—´
    int max_del_time;   // æœ€å¤§åˆ é™¤æ—¶é—´( è¿žæŽ¥ç©ºé—²æ—¶é—´è¶…过这个,就给当前连接关闭 )
    queue<MysqlConn*> m_connkQueue;   // è¿žæŽ¥é˜Ÿåˆ—
    mutex m_mutex;  // äº’斥锁
    condition_variable m_cond;   // æ¡ä»¶å˜é‡
};