数据库MySql类库系列(二)-DBService
2017-03-06 17:59
204 查看
第二个工具类:DBService
用于MySQL数据库服务类的基类。主要处理数据库连接的建立(Start),断开(Stop),维持心跳(Ping)。
基于之前的DBOperator实现。
该基类提供两个虚接口,ProcessStart,ProcessStop,交由子类去实现子类自己的初始化工作,和释放工作。
建立连接(Start)时,会断开现有连接(如果有的话,会先调用ProcessStop做清理工作),然后建立新连接,连接建立好之后调用ProcessStart。
断开连接(Stop)时,调用ProcessStop做清理工作,然后断开现有连接。
维持心跳(Ping)时,如果发现连接断开,则重新连接。如果连不上则放弃,等待下一次Ping,或逻辑主动调用Start重新建立连接。
DBService中保存一个建立好的数据库连接,并加锁,保证多线程同时访问DBService时线程安全。
具体会在这个连接上,做哪些数据库操作,做什么样的增删改查,由子类实现,它跟具体业务逻辑相关。
DBService.h
DBService.cpp
用于MySQL数据库服务类的基类。主要处理数据库连接的建立(Start),断开(Stop),维持心跳(Ping)。
基于之前的DBOperator实现。
该基类提供两个虚接口,ProcessStart,ProcessStop,交由子类去实现子类自己的初始化工作,和释放工作。
建立连接(Start)时,会断开现有连接(如果有的话,会先调用ProcessStop做清理工作),然后建立新连接,连接建立好之后调用ProcessStart。
断开连接(Stop)时,调用ProcessStop做清理工作,然后断开现有连接。
维持心跳(Ping)时,如果发现连接断开,则重新连接。如果连不上则放弃,等待下一次Ping,或逻辑主动调用Start重新建立连接。
DBService中保存一个建立好的数据库连接,并加锁,保证多线程同时访问DBService时线程安全。
具体会在这个连接上,做哪些数据库操作,做什么样的增删改查,由子类实现,它跟具体业务逻辑相关。
DBService.h
#ifndef __DBService_H__ #define __DBService_H__ #include <boost/thread.hpp> struct st_mysql; typedef struct st_mysql MYSQL; namespace common{ namespace db{ class DBService { public: DBService(); virtual ~DBService(); public: // 建立数据库连接 bool Start(const std::string& hostname, unsigned int port, const std::string& username, const std::string& userkey, const std::string& dbname); virtual bool ProcessStart(); // 维持数据库连接心跳,校验链接是否断开,断开则重连 void Ping(); // 断开数据库连接 void Stop(); virtual void ProcessStop(); protected: // 数据库连接 boost::mutex m_Lock; MYSQL *m_Connect; private: // 建立新链接 bool Connect(); // 终止链接 void DisConnect(); // 数据库连接参数 std::string m_HostName; unsigned int m_Port; std::string m_UserName; std::string m_UserKey; std::string m_DBName; }; } } #endif
DBService.cpp
#include "DBService.h" #include "Logger.h" using namespace common::tool; #include "DBDefine.h" #include "DBOperator.h" namespace common{ namespace db{ DBService::DBService() { m_Connect = NULL; } DBService::~DBService() { DisConnect(); } bool DBService::Start(const std::string& hostname, unsigned int port, const std::string& username, const std::string& userkey, const std::string& dbname) { boost::mutex::scoped_lock lock(m_Lock); DisConnect(); m_HostName = hostname; m_Port = port; m_UserName = username; m_UserKey = userkey; m_DBName = dbname; return Connect(); } bool DBService::ProcessStart() { return false; } void DBService::Ping() { boost::mutex::scoped_try_lock lock(m_Lock); if (lock.owns_lock()) { if (!DBOperator::Ping(m_Connect)) { DisConnect(); Connect(); } } } void DBService::Stop() { boost::mutex::scoped_lock lock(m_Lock); DisConnect(); } void DBService::ProcessStop() { } bool DBService::Connect() { m_Connect = DBOperator::Connect(m_HostName.c_str(), m_Port, m_UserName.c_str(), m_UserKey.c_str(), m_DBName.c_str()); if (NULL != m_Connect) { if (ProcessStart()) { LOG_INFO(g_LibDBLog) << "connect " << m_HostName << ":" << m_DBName << "@" << m_UserName << " success"; return true; } else { LOG_INFO(g_LibDBLog) << "connect " << m_HostName << ":" << m_DBName << "@" << m_UserName << " error"; DisConnect(); return false; } } else { LOG_INFO(g_LibDBLog) << "connect " << m_HostName << ":" << m_DBName << "@" << m_UserName << " error"; return false; } } void DBService::DisConnect() { if (NULL != m_Connect) { LOG_INFO(g_LibDBLog) << "close " << m_HostName << ":" << m_DBName << "@" << m_UserName; ProcessStop(); DBOperator::DisConnect(m_Connect); m_Connect = NULL; } } } }
相关文章推荐
- 数据库MySql类库系列(三)-QueryOperatorUpdate
- 数据库MySql类库系列(六)-PrepareOperatorUpdate
- 数据库MySql类库系列(一)-DBOperator
- 数据库MySql类库系列(七)-PrepareOperatorSelect
- 数据库MySql类库系列(九)-DBServicePool
- 数据库MySql类库系列(八)-预处理执行Sql方式的示例
- MySql 数据库系列问题
- mysql系列:数据库优化
- 卦卦学mysql系列(1)——mysql入门 对数据库的操作
- 渣渣小本求职复习之路每天一博客系列——数据库基础(MySQL)(1)
- 后端分布式系列:分布式存储-MySQL 数据库事务与复制
- JBoss 系列七十八: jBPM 6 使用 Mysql 替换默认的 H2 数据库
- mysql系列:ddl数据库定义+sql操作语句
- MySQL 数据库性能优化之SQL优化(这是 MySQL数据库性能优化专题 系列的第四篇文章)
- MySQL系列:查看并修改当前数据库的编码
- PowerDesigner系列之四:生成数据库时的列中文注释乱码问题[mysql]
- 【十分钟系列课程】第二集~MySQL客户端安装及创建数据库
- MySQL 数据库性能优化之索引优化(这是 MySQL数据库性能优化专题 系列的第三篇文章)
- Delphi XE3 数据库系列(一):使用dbexpress访问mysql
- 渣渣小本求职复习之路每天一博客系列——数据库基础(MySQL)(2)