数据库MySql类库系列(九)-DBServicePool
来源:互联网 发布:查看mysql用户权限 编辑:程序博客网 时间:2024/06/05 22:59
第七个工具类: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
0 0
- 数据库MySql类库系列(九)-DBServicePool
- C#探秘系列(九)WPF连接Mysql数据库
- **MYSQL** 系列九
- 数据库MySql类库系列(一)-DBOperator
- 数据库MySql类库系列(三)-QueryOperatorUpdate
- 数据库MySql类库系列(二)-DBService
- 数据库MySql类库系列(四)-QueryOperatorSelect
- 数据库MySql类库系列(六)-PrepareOperatorUpdate
- 数据库MySql类库系列(七)-PrepareOperatorSelect
- MySQL数据库九
- Mysql 体系结构系列之九
- 工具类库系列(九)-ReflectEnum
- MySQL---数据库从入门走向大神系列(九)-用Java向数据库读写大文本/二进制文件数据
- mysql系列:数据库优化
- MySql 系列数据库详解
- Django连接mysql出问题系列之九
- [python] 专题九.Mysql数据库编程基础知识
- MySQL系列之一:数据库设计
- Jsoup实现网络爬虫抓取数据
- CODEVS 1230 元素查找
- CT107D蓝桥杯EEPROM使用(8)
- 解决 vc6 unresolved external symbol ___security_cookie 问题
- follow Sam哥 OS 课程的漫长之路 Day2
- 数据库MySql类库系列(九)-DBServicePool
- acm 某菜一搏
- CF27E:Number With The Given Amount Of Divisors(反素数)
- 一键转载CSDN博客
- 2D游戏总结
- Java集成Weka做线性回归的例子
- 太阳系小案例--H5C3
- perl data::dumper 模块使用
- Redis常见的5种不同的数据类型详解