数据库MySql类库系列(九)-DBServicePool

第七个工具类:DBServicePool


是针对前文提到的DBService的一个管理器

用于多线程环境下,可能有需求需要创建多个DBService,使得每个线程有机会可以独享一个DBService

所以有了这样一个DBService的管理器

提供Start,Stop,用来运行/停止所有DBService对象

提供Ping,用来维持所有DBService对象的心跳

提供一个虚接口Service,子类可以实现管理自己的继承自DBService的子类对象

比如:

实现一个MyDBService : public DBService

实现一个MyDBServicePool : public DBServicePool

DBServicePool的Service接口,实现的是创建一个DBService对象,返回其shared_ptr

MyDBServicePool 的Service接口,可以自行实现创建一个MyDBService对象,返回其shared_ptr


2017.3.10修改:

改为模板实现

模板类型T,T要求为DBService或其子类

Start并入构造函数,构造时创建指定个数的T对象,可以指定为0个,即不创建任何DBService或其子类对象

虚接口Service删除,不再需要,创建时,直接new T(...)

GetDBService:获取一个DBService对象,当Pool中没有DBService对象时(构造时指定了个数为0),抛一个异常


修改后代码:

DBServicePool.h

#ifndef __DBServicePool_H__
#define	__DBServicePool_H__

#include <boost/noncopyable.hpp>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>

#include "DBService.h"

namespace common{
	namespace db{

		template <class T>
		class DBServicePool : private boost::noncopyable
		{
		public:
			DBServicePool(unsigned int size,
				const std::string& hostname,
				unsigned int port,
				const std::string& username,
				const std::string& userkey,
				const std::string& dbname);
			virtual ~DBServicePool();

			// 停止所有DBService对象
			void Stop();

			DBService& GetDBService();

			// 获取IOService对象个数
			std::size_t Size();

			// 维持链接心跳
			void Ping();

		private:
			boost::mutex m_Lock;

			// DBService列表
			std::vector<boost::shared_ptr<DBService> > m_DBServices;

			// 顺序使用的下一个DBService下标
			unsigned int m_Next;
		};

		template <class T>
		DBServicePool<T>::DBServicePool(unsigned int size,
			const std::string& hostname,
			unsigned int port,
			const std::string& username,
			const std::string& userkey,
			const std::string& dbname)
		{
			for (unsigned int i = 0; i < size; i++)
			{
				boost::shared_ptr<DBService> dbService(new T());
				if (NULL != dbService)
				{
					dbService->Start(hostname, port, username, userkey, dbname);
					m_DBServices.push_back(dbService);
				}
			}

			m_Next = 0;
		}

		template <class T>
		DBServicePool<T>::~DBServicePool()
		{

		}

		template <class T>
		void DBServicePool<T>::Stop()
		{
			boost::mutex::scoped_lock lock(m_Lock);

			for (std::size_t i = 0; i < m_DBServices.size(); ++i)
			{
				m_DBServices[i]->Stop();
			}
		}

		template <class T>
		DBService& DBServicePool<T>::GetDBService()
		{
			boost::mutex::scoped_lock lock(m_Lock);

			if (0 < m_DBServices.size())
			{
				m_Next++;
				if (m_Next >= m_DBServices.size())
				{
					m_Next = 0;
				}

				return *m_DBServices[m_Next];
			}
			else
			{
				throw std::string("DBServicePool size is 0");
			}
		}

		template <class T>
		std::size_t DBServicePool<T>::Size()
		{
			boost::mutex::scoped_lock lock(m_Lock);

			return m_DBServices.size();
		}

		template <class T>
		void DBServicePool<T>::Ping()
		{
			boost::mutex::scoped_lock lock(m_Lock);

			for (std::size_t i = 0; i < m_DBServices.size(); ++i)
			{
				m_DBServices[i]->Ping();
			}
		}

	}
}

#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值