IM 开源项目 群组服务 数据库设计-数据库访问 (05)

 数据库简单连接池 及 连接管理智能指针设计实现

【定义文件】

/* 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();
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值