#ifndef __ODBC_POOL__ #define __ODBC_POOL__ #pragma once #include "SafeList.h" #include <afxdb.h> class CODBCPool { ThreadSection m_critSection; // �������ݿ����ӳ�; ODBCConnectList m_listIdleConnections; // ��ʹ�õ����ݿ����ӳ�; ODBCConnectList m_listBusyConnections; // ���õ�ָ�꣺�����С; INT m_nMaxCount; INT m_nMinCount; // �����ָ�����; DWORD m_dwDBPort; CString m_strDBSource; CString m_strDBAccount; CString m_strPassWord; CString m_strDBName; BOOL m_bNeedExit; // �˳����ݳ�; BOOL m_bNeedStop; BOOL m_bNeedConnection; public: CODBCPool(void) ; ~CODBCPool(void); // ��ȡʵ��ָ��; static CODBCPool* GetInstance() { static CODBCPool* pInstance = NULL; if ( pInstance == NULL ) pInstance = new CODBCPool; return pInstance; } // ��ʼ����������; DWORD InitializePool( IN LPCTSTR lpDBSource, IN CONST DWORD &dwDBPort, IN LPCTSTR lpDBAccount, IN LPCTSTR lpPassWord, IN LPCTSTR lpDBName, IN CONST INT &nMinConn = 1, IN CONST INT &nMaxConn = 5 ); // �ر���������; void ReleasePool(); // �������ݿ���Ϣ; void SetDBConnectionInfo(IN LPCTSTR lpDBSource, IN CONST DWORD &dwDBPort, IN LPCTSTR lpDBAccount, IN LPCTSTR lpPassWord, IN LPCTSTR lpDBName); // ��ʼ����������; INT IntiAllConnections(); // �Ͽ���������; void DestroyAllDBConnections(); // ��ȡһ����������; CDatabase* GetAConnection( IN CONST DWORD &dwTimeOut = 1000 ); // �������Ӹ����ж���; void RestoreAConnection(IN CDatabase *pDBEngine); // �ر�һ������; void CloseAConnection(CDatabase *&pDBEngine); // �ر�ʹ�õ�����; void CloseBusyConnection(IN CDatabase *&pDataBase); private: volatile LONG m_nRef; volatile LONG m_nObjRef; // ����һ������; CDatabase* InitAConnection(); // ����������Ԫ��; friend class ODBCConnGuard; }; // ODBC������Ƭ��; class ODBCConnGuard { CDatabase *m_pODBCConn; public: ODBCConnGuard( CDatabase *&pDBConn, CONST DWORD &dwTimeOut = 30000 ):m_pODBCConn(NULL) { pDBConn = CODBCPool::GetInstance()->GetAConnection( dwTimeOut ); m_pODBCConn = pDBConn; } virtual ~ODBCConnGuard() { CODBCPool::GetInstance()->RestoreAConnection(m_pODBCConn); } }; #endif // __SAFE_LIST__