MysqlConnPool.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #ifndef YASERVER_MYSQLCONNPOOL_H_
  2. #define YASERVER_MYSQLCONNPOOL_H_
  3. #include <mysql.h>
  4. #include <list>
  5. using namespace std;
  6. class CMysqlConn{
  7. public:
  8. CMysqlConn(const char *option, const char *host, const char *user,
  9. const char *password, const char* dbname, unsigned int port,
  10. const char *unix_socket, unsigned long clientflag, bool &state);
  11. virtual ~CMysqlConn();
  12. public:
  13. // 连接到数据库
  14. int SetOption();
  15. int Open();
  16. // 关闭数据库clei
  17. int Close();
  18. // 数据库是否已连接
  19. bool IsOpen() const;
  20. // query
  21. MYSQL_RES * Execute(const char * strSQL, int &err);
  22. MYSQL_RES * MultiExecute( const char * strSQL, int &err);
  23. private:
  24. MYSQL * m_pConn;
  25. bool m_bValid; // 已被初始化成功标识
  26. bool m_bOpen;
  27. const char * m_option;
  28. const char * m_host;
  29. const char * m_user;
  30. const char * m_pwd;
  31. const char * m_db;
  32. unsigned int m_port;
  33. const char * m_unix_socket;
  34. unsigned long m_clientflag;
  35. };
  36. typedef std::list<CMysqlConn*> DBConnectList;
  37. class CMysqlConnPool
  38. {
  39. public:
  40. // 获取实例指针
  41. static CMysqlConnPool &Instanse(){
  42. static CMysqlConnPool m_pInstanse;
  43. return m_pInstanse;
  44. };
  45. // 初始化所有连接
  46. int InitAllConn();
  47. // 关闭所有连接
  48. void CloseAllConn();
  49. // 获取一个空闲连接
  50. CMysqlConn* GetNewConn();
  51. // 交还连接给空闲队列
  52. int RestoreConn(CMysqlConn* pDBEngine);
  53. void Init(const char* szOption, const char *szHost, const char *szUser, const char *szPwd, const char *szDbName,
  54. unsigned int nPort, const char * szUnixSocket, unsigned long nClientFlag);
  55. private:
  56. // 唯一实例
  57. CMysqlConnPool();
  58. virtual ~CMysqlConnPool();
  59. // 创建一个连接
  60. int InitNewConn();
  61. // 关闭一个连接
  62. void CloseConn(CMysqlConn* pDBEngine);
  63. // 停止工作线程
  64. void StopThread();
  65. // 判断是否需要停止
  66. BOOL IsNeedStop();
  67. BOOL IsNeedConnection();
  68. // 将守卫类作为连接池类的友元类
  69. friend class CDBConnGuard;
  70. // 空闲数据库连接队列
  71. DBConnectList m_listIdleConnection;
  72. // 在使用的数据库连接
  73. DBConnectList m_listBusyConnection;
  74. // 队列保护的临界区
  75. CRITICAL_SECTION m_csIdleConnList;
  76. CRITICAL_SECTION m_csBusyConnList;
  77. // 可用连接总数的三个指标:最大、最小
  78. unsigned int m_nMaxCount;
  79. unsigned int m_nMinCount;
  80. // 数据库信息
  81. std::string m_strHost;
  82. std::string m_strUser;
  83. std::string m_strPwd;
  84. std::string m_strUnixSocket;
  85. std::string m_strOption;
  86. std::string m_strDbName;
  87. //const char * m_strHost;
  88. //const char * m_strUser;
  89. //const char * m_strPwd;
  90. //const char * m_strUnixSocket;
  91. //const char * m_strOption;
  92. //const char * m_strDbName;
  93. unsigned int m_nPort;
  94. unsigned long m_nClientFlag;
  95. // 维护线程
  96. HANDLE m_hMaintanceThread; // 线程句柄
  97. HANDLE m_hHaveData; // 信号
  98. BOOL m_bNeedStop; // 管理线程起停的标志位
  99. BOOL m_bNeedConnection; // 需要创建连接的标志
  100. static DWORD WINAPI thread_run( LPVOID pdata);
  101. };
  102. class CDBConnGuard{
  103. public:
  104. CDBConnGuard(CMysqlConn* &pDbConn){
  105. pDbConn = CMysqlConnPool::Instanse().GetNewConn();
  106. m_pDbConn = pDbConn;
  107. }
  108. virtual ~CDBConnGuard()
  109. {
  110. CMysqlConnPool::Instanse().RestoreConn(m_pDbConn);
  111. }
  112. private:
  113. CMysqlConn * m_pDbConn;
  114. };
  115. #define GetConnPool() CMysqlConnPool::Instanse()
  116. #endif //YASERVER_MYSQLCONNPOOL_H_