dbPool.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #ifndef __ODBC_POOL__
  2. #define __ODBC_POOL__
  3. #pragma once
  4. #include "SafeList.h"
  5. #include <afxdb.h>
  6. class CODBCPool
  7. {
  8. ThreadSection m_critSection;
  9. // 空闲数据库连接池;
  10. ODBCConnectList m_listIdleConnections;
  11. // 在使用的数据库连接池;
  12. ODBCConnectList m_listBusyConnections;
  13. // 可用的指标:最大、最小;
  14. INT m_nMaxCount;
  15. INT m_nMinCount;
  16. // 引入的指针变量;
  17. DWORD m_dwDBPort;
  18. CString m_strDBSource;
  19. CString m_strDBAccount;
  20. CString m_strPassWord;
  21. CString m_strDBName;
  22. BOOL m_bNeedExit; // 退出数据池;
  23. BOOL m_bNeedStop;
  24. BOOL m_bNeedConnection;
  25. public:
  26. CODBCPool(void) ;
  27. ~CODBCPool(void);
  28. // 获取实例指针;
  29. static CODBCPool* GetInstance()
  30. {
  31. static CODBCPool* pInstance = NULL;
  32. if ( pInstance == NULL )
  33. pInstance = new CODBCPool;
  34. return pInstance;
  35. }
  36. // 初始化所有连接;
  37. DWORD InitializePool(
  38. IN LPCTSTR lpDBSource,
  39. IN CONST DWORD &dwDBPort,
  40. IN LPCTSTR lpDBAccount,
  41. IN LPCTSTR lpPassWord,
  42. IN LPCTSTR lpDBName,
  43. IN CONST INT &nMinConn = 1,
  44. IN CONST INT &nMaxConn = 5
  45. );
  46. // 关闭所有连接;
  47. void ReleasePool();
  48. // 设置数据库信息;
  49. void SetDBConnectionInfo(IN LPCTSTR lpDBSource, IN CONST DWORD &dwDBPort, IN LPCTSTR lpDBAccount, IN LPCTSTR lpPassWord, IN LPCTSTR lpDBName);
  50. // 初始化所有连接;
  51. INT IntiAllConnections();
  52. // 断开所有连接;
  53. void DestroyAllDBConnections();
  54. // 获取一个空闲连接;
  55. CDatabase* GetAConnection( IN CONST DWORD &dwTimeOut = 1000 );
  56. // 交还连接给空闲队列;
  57. void RestoreAConnection(IN CDatabase *pDBEngine);
  58. // 关闭一个连接;
  59. void CloseAConnection(CDatabase *&pDBEngine);
  60. // 关闭使用的连接;
  61. void CloseBusyConnection(IN CDatabase *&pDataBase);
  62. private:
  63. volatile LONG m_nRef;
  64. volatile LONG m_nObjRef;
  65. // 创建一个连接;
  66. CDatabase* InitAConnection();
  67. // 将守卫类友元化;
  68. friend class ODBCConnGuard;
  69. };
  70. // ODBC守卫垫片类;
  71. class ODBCConnGuard
  72. {
  73. CDatabase *m_pODBCConn;
  74. public:
  75. ODBCConnGuard( CDatabase *&pDBConn, CONST DWORD &dwTimeOut = 30000 ):m_pODBCConn(NULL)
  76. {
  77. pDBConn = CODBCPool::GetInstance()->GetAConnection( dwTimeOut );
  78. m_pODBCConn = pDBConn;
  79. }
  80. virtual ~ODBCConnGuard()
  81. {
  82. CODBCPool::GetInstance()->RestoreAConnection(m_pODBCConn);
  83. }
  84. };
  85. #endif // __SAFE_LIST__