数据库简单连接池 及 连接管理智能指针设计实现
【定义文件】
/* CLASS_BEGIN *****************************************************
类名: CIMGroupDbCache
功能: 连接缓存
1. 连接池
2. 智能指针
版本: V1.0
时间: 2012-3-19 创建
实现: Snight Q:51171107
CLASS_END ******************************************************/
#ifndef H_IMGROUPDBCACHE_H
#define H_IMGROUPDBCACHE_H
#include "LoadConfig.h"
#include "MysqlHelper.h"
#include "CRunningLog.h"
#include "SImGroupDbRead.h"
#include "SImGroupDbWrite.h"
class CIMGroupDbCache
{
public:
~CIMGroupDbCache(void);
static CIMGroupDbCache* GetSigoObj(void);
static void FreeSigoObj(void);
// 初始化数据库连接
BOOL InitCache(CLoadConfig* apConfig);
// 获取数据库读对象
CImGroupDbRead* GetGroupDbReader(void);
// 获取数据库写对象
CImGroupDbWrite* GetGroupDbWriter(void);
private:
static CIMGroupDbCache* m_pSigoObj;
CIMGroupDbCache(void);
BOOL m_bIsInit; // 是否初始化
CLoadConfig* m_pConfig; // 配置文件对象
int m_iConnectCnt; // 数据库连接个数
CDBConnecter* m_pGroupDBReader; // 数据库读连接池
CDBConnecter* m_pGroupDBWriter; // 数据库写连接池
friend class AutoDbReaderPtr;
friend class AutoDbWriterPtr;
};
// 自动数据库读对象
class AutoDbReaderPtr
{
public:
AutoDbReaderPtr(CIMGroupDbCache* apGroupObj);
~AutoDbReaderPtr(void);
CImGroupDbRead* operator->(void) const
{ return m_pDbReader; }
BOOL IsAvailable(void)
{
if (m_pDbReader)return TRUE;
return FALSE;
}
private:
CImGroupDbRead& operator*(void) const;
void operator = (const AutoDbReaderPtr&);
AutoDbReaderPtr(const AutoDbReaderPtr&);
CImGroupDbRead* m_pDbReader;
CDBConnecter* m_pConnecter;
CIMGroupDbCache* m_pGroupDbCache;
};
// 自动数据库写对象
class AutoDbWriterPtr
{
public:
AutoDbWriterPtr(CIMGroupDbCache* apGroupObj);
~AutoDbWriterPtr(void);
CImGroupDbWrite* operator->(void) const
{ return m_pDbWriter; }
BOOL IsAvailable(void)
{
if (m_pDbWriter)return TRUE;
return FALSE;
}
private:
CImGroupDbWrite& operator*(void) const ;
void operator = (const AutoDbWriterPtr&);
AutoDbWriterPtr(const AutoDbWriterPtr&);
CImGroupDbWrite* m_pDbWriter;
CDBConnecter* m_pConnecter;
CIMGroupDbCache* m_pGroupDbCache;
};
#endif//H_IMGROUPDBCACHE_H
【实现文件】
#include "StdAfx.h"
#include "IMGroupDbCache.h"
CIMGroupDbCache* CIMGroupDbCache::m_pSigoObj = 0;
CIMGroupDbCache::CIMGroupDbCache(void) : m_bIsInit(FALSE)
{
}
CIMGroupDbCache::~CIMGroupDbCache(void)
{
}
CIMGroupDbCache* CIMGroupDbCache::GetSigoObj(void)
{
if (!m_pSigoObj)
m_pSigoObj = new CIMGroupDbCache();
return m_pSigoObj;
}
void CIMGroupDbCache::FreeSigoObj(void)
{
if (m_pSigoObj)
delete m_pSigoObj;
}
// 初始化缓存
BOOL CIMGroupDbCache::InitCache(CLoadConfig* apConfig)
{
if (m_bIsInit)
return TRUE;
if (!(m_pConfig = apConfig))
{
ERROR_LOG("ERROR: CIMGroupDbCache::InitCache false apConfig = NULL!");
return FALSE;
}
BOOL lbResult = TRUE;
std::string lstrDBHost = m_pConfig->GetParam("DB_IM_GROUP", "DB_HOST");
std::string lstrDBPort = m_pConfig->GetParam("DB_IM_GROUP", "DB_PORT");
std::string lstrDBName = m_pConfig->GetParam("DB_IM_GROUP", "DB_NAME");
std::string lstrDBUser = m_pConfig->GetParam("DB_IM_GROUP", "DB_USER");
std::string lstrDBPswd = m_pConfig->GetParam("DB_IM_GROUP", "DB_PSWD");
std::string lstrDBPool = m_pConfig->GetParam("DB_IM_GROUP", "DB_POOL");
m_iConnectCnt = atoi(lstrDBPool.c_str());
if (0 >= m_iConnectCnt || 100 < m_iConnectCnt)
{
ERROR_LOG("ERROR: CIMGroupDbCache::InitCache 错误的连接池设置 ConnectCnt:%d!", m_iConnectCnt);
return FALSE;
}
m_pGroupDBReader = new CDBConnecter[m_iConnectCnt];
m_pGroupDBWriter = new CDBConnecter[m_iConnectCnt];
if ((NULL == m_pGroupDBReader) || (NULL == m_pGroupDBWriter))
{
ERROR_LOG("ERROR: CIMGroupDbCache::InitCache false m_pGroupDBReader:NULL or m_pGroupDBWriter:NULL!");
return FALSE;
}
for (int i = 0; i < m_iConnectCnt; ++i)
{
CImGroupDbRead* lpGroupDBRead = new CImGroupDbRead();
if (!lpGroupDBRead)
{
ERROR_LOG("ERROR: CIMGroupDbCache::InitCache false lpGroupDBRead:NULLNULL!");
lbResult = FALSE;
break;;
}
lpGroupDBRead->InitDataBase();
CImGroupDbWrite* lpGroupDBWrite = new CImGroupDbWrite();
if (NULL == lpGroupDBWrite)
{
delete lpGroupDBRead;
lpGroupDBRead = NULL;
ERROR_LOG("ERROR: CIMGroupDbCache::InitCache false lpGroupDBWrite:NULL");
lbResult = FALSE;
break;;
}
lpGroupDBWrite->InitDataBase();
if (!lpGroupDBRead->ConnectDb( (char*)lstrDBHost.c_str(), (char*)lstrDBUser.c_str(),(char*)lstrDBPswd.c_str(),
(char*)lstrDBName.c_str(),atoi(lstrDBPort.c_str())))
{
delete lpGroupDBRead;
delete lpGroupDBWrite;
ERROR_LOG("ERROR: CIMGroupDbCache::InitCache m_pGroupDBRead->ConnectDb false Host:%s, User:%s, DBName:%s, PSWD:%s, Port:%s",
lstrDBHost.c_str(), lstrDBUser.c_str(), lstrDBName.c_str(),lstrDBPswd.c_str() ,lstrDBPort.c_str());
lbResult = FALSE;
break;;
}
INFO_LOG("INFO: Connect db 成功 Host:%s, User:%s, DBName:%s, PSWD:%s, Port:%s",
lstrDBHost.c_str(), lstrDBUser.c_str(), lstrDBName.c_str(),lstrDBPswd.c_str() ,lstrDBPort.c_str());
if (!lpGroupDBWrite->ConnectDb( (char*)lstrDBHost.c_str(), (char*)lstrDBUser.c_str(),(char*)lstrDBPswd.c_str(),
(char*)lstrDBName.c_str(),atoi(lstrDBPort.c_str())))
{
delete lpGroupDBRead;
delete lpGroupDBWrite;
ERROR_LOG("ERROR: CIMGroupDbCache::InitCache m_pGroupDBRead->ConnectDb false! Host:%s, User:%s, DBName:%s, PSWD:%s, Port:%s",
lstrDBHost.c_str(), lstrDBUser.c_str(), lstrDBName.c_str(),lstrDBPswd.c_str() ,lstrDBPort.c_str());
lbResult = FALSE;
break;;
}
INFO_LOG("INFO: Connect db 成功 Host:%s, User:%s, DBName:%s, PSWD:%s, Port:%s",
lstrDBHost.c_str(), lstrDBUser.c_str(), lstrDBName.c_str(),lstrDBPswd.c_str() ,lstrDBPort.c_str());
m_pGroupDBReader[i].SetDbConnecter(lpGroupDBRead);
m_pGroupDBWriter[i].SetDbConnecter(lpGroupDBWrite);
}
if (lbResult = FALSE)
{
delete [] m_pGroupDBReader;
delete [] m_pGroupDBWriter;
}
return TRUE;
}
// 获取数据库读对象
CImGroupDbRead* CIMGroupDbCache::GetGroupDbReader(void)
{
CDBConnecter* lpConnecter = CDBConnecter::GetDataBase(m_pGroupDBReader, m_iConnectCnt);
if (lpConnecter)
return (CImGroupDbRead*)lpConnecter->GetDbConnecter();
return NULL;
}
// 获取数据库写对象
CImGroupDbWrite* CIMGroupDbCache::GetGroupDbWriter(void)
{
CDBConnecter* lpConnecter = CDBConnecter::GetDataBase(m_pGroupDBWriter, m_iConnectCnt);
if (lpConnecter)
return (CImGroupDbWrite*)lpConnecter->GetDbConnecter();
return NULL;
}
/***** 自动数据库读对象 *****/
AutoDbReaderPtr::AutoDbReaderPtr(CIMGroupDbCache* apGroupObj)
: m_pConnecter(NULL)
, m_pDbReader(NULL)
{
if (apGroupObj)
{
m_pGroupDbCache = m_pGroupDbCache;
m_pConnecter = CDBConnecter::GetDataBase(apGroupObj->m_pGroupDBReader, apGroupObj->m_iConnectCnt);
if (m_pConnecter)
m_pDbReader =(CImGroupDbRead*)m_pConnecter->GetDbConnecter();
}
}
AutoDbReaderPtr::~AutoDbReaderPtr(void)
{
if (m_pConnecter)
m_pConnecter->BackDbConnecter();
}
/***** 自动数据库写对象 *****/
AutoDbWriterPtr::AutoDbWriterPtr(CIMGroupDbCache* apGroupObj)
: m_pConnecter(NULL)
, m_pDbWriter(NULL)
{
if (apGroupObj)
{
m_pGroupDbCache = m_pGroupDbCache;
m_pConnecter = CDBConnecter::GetDataBase(apGroupObj->m_pGroupDBWriter, apGroupObj->m_iConnectCnt);
if (m_pConnecter)
m_pDbWriter =(CImGroupDbWrite*)m_pConnecter->GetDbConnecter();
}
}
AutoDbWriterPtr::~AutoDbWriterPtr(void)
{
if (m_pConnecter)
m_pConnecter->BackDbConnecter();
}