第二个工具类:DBService
用于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; }; }}#endifDBService.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; } } }}
新闻热点
疑难解答