240717班级,工业化控制系统,煤矿相关行业,昆仑系统
lzx
2024-11-05 6cc341355e736952329b328232c2560dc6f29060
Server/ÍõçûÔª/code/ConnectionPool.h
@@ -1,54 +1,50 @@
#pragma once
#include "MysqlConn.h"
#include "./tinyxml/tinyxml.h"
#include <queue>
#include <mutex>
#include <thread>
#include <atomic>
#include <condition_variable>
//#include <json/json.h>
#include "MysqlConn.h"
#pragma comment(lib, "./tinyxml/x64/Debug/tinyxml.lib")
//using namespace Json;
// åº”用-单例模式:懒汉模式[需要考虑多线程安全问题]
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( );
   std::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();  // å¢žåŠ è¿žæŽ¥æ•°
   std::string  m_ip;
   std::string  m_userName;
   std::string  m_passwd;
   std::string  m_db;
   unsigned short m_port;
   int m_max_conn;
   int m_min_conn;
   int m_timeout;      // è¿žæŽ¥è¶…æ—¶æ—¶é—´
   int max_del_time;   // æœ€å¤§åˆ é™¤æ—¶é—´( è¿žæŽ¥ç©ºé—²æ—¶é—´è¶…过这个,就给当前连接关闭 )
   std::queue<MysqlConn*>m_connkQueue ;   // è¿žæŽ¥é˜Ÿåˆ—
   std::mutex m_mutex;  // äº’斥锁
   std::condition_variable m_cond;   // æ¡ä»¶å˜é‡
};