当前位置:   article > 正文

数据库MySql类库系列(二)-DBService

dbservice

第二个工具类:DBService


用于MySQL数据库服务类的基类。主要处理数据库连接的建立(Start),断开(Stop),维持心跳(Ping)。


基于之前的DBOperator实现。


该基类提供两个虚接口,ProcessStart,ProcessStop,交由子类去实现子类自己的初始化工作,和释放工作。

建立连接(Start)时,会断开现有连接(如果有的话,会先调用ProcessStop做清理工作),然后建立新连接,连接建立好之后调用ProcessStart。

断开连接(Stop)时,调用ProcessStop做清理工作,然后断开现有连接。

维持心跳(Ping)时,如果发现连接断开,则重新连接。如果连不上则放弃,等待下一次Ping,或逻辑主动调用Start重新建立连接。


DBService中保存一个建立好的数据库连接,并加锁,保证多线程同时访问DBService时线程安全。


具体会在这个连接上,做哪些数据库操作,做什么样的增删改查,由子类实现,它跟具体业务逻辑相关。


DBService.h

  1. #ifndef __DBService_H__
  2. #define __DBService_H__
  3. #include <boost/thread.hpp>
  4. struct st_mysql;
  5. typedef struct st_mysql MYSQL;
  6. namespace common{
  7. namespace db{
  8. class DBService
  9. {
  10. public:
  11. DBService();
  12. virtual ~DBService();
  13. public:
  14. // 建立数据库连接
  15. bool Start(const std::string& hostname,
  16. unsigned int port,
  17. const std::string& username,
  18. const std::string& userkey,
  19. const std::string& dbname);
  20. virtual bool ProcessStart();
  21. // 维持数据库连接心跳,校验链接是否断开,断开则重连
  22. void Ping();
  23. // 断开数据库连接
  24. void Stop();
  25. virtual void ProcessStop();
  26. protected:
  27. // 数据库连接
  28. boost::mutex m_Lock;
  29. MYSQL *m_Connect;
  30. private:
  31. // 建立新链接
  32. bool Connect();
  33. // 终止链接
  34. void DisConnect();
  35. // 数据库连接参数
  36. std::string m_HostName;
  37. unsigned int m_Port;
  38. std::string m_UserName;
  39. std::string m_UserKey;
  40. std::string m_DBName;
  41. };
  42. }
  43. }
  44. #endif

DBService.cpp

  1. #include "DBService.h"
  2. #include "Logger.h"
  3. using namespace common::tool;
  4. #include "DBDefine.h"
  5. #include "DBOperator.h"
  6. namespace common{
  7. namespace db{
  8. DBService::DBService()
  9. {
  10. m_Connect = NULL;
  11. }
  12. DBService::~DBService()
  13. {
  14. DisConnect();
  15. }
  16. bool DBService::Start(const std::string& hostname,
  17. unsigned int port,
  18. const std::string& username,
  19. const std::string& userkey,
  20. const std::string& dbname)
  21. {
  22. boost::mutex::scoped_lock lock(m_Lock);
  23. DisConnect();
  24. m_HostName = hostname;
  25. m_Port = port;
  26. m_UserName = username;
  27. m_UserKey = userkey;
  28. m_DBName = dbname;
  29. return Connect();
  30. }
  31. bool DBService::ProcessStart()
  32. {
  33. return false;
  34. }
  35. void DBService::Ping()
  36. {
  37. boost::mutex::scoped_try_lock lock(m_Lock);
  38. if (lock.owns_lock())
  39. {
  40. if (!DBOperator::Ping(m_Connect))
  41. {
  42. DisConnect();
  43. Connect();
  44. }
  45. }
  46. }
  47. void DBService::Stop()
  48. {
  49. boost::mutex::scoped_lock lock(m_Lock);
  50. DisConnect();
  51. }
  52. void DBService::ProcessStop()
  53. {
  54. }
  55. bool DBService::Connect()
  56. {
  57. m_Connect = DBOperator::Connect(m_HostName.c_str(), m_Port, m_UserName.c_str(), m_UserKey.c_str(), m_DBName.c_str());
  58. if (NULL != m_Connect)
  59. {
  60. if (ProcessStart())
  61. {
  62. LOG_INFO(g_LibDBLog) << "connect " << m_HostName << ":" << m_DBName << "@" << m_UserName << " success";
  63. return true;
  64. }
  65. else
  66. {
  67. LOG_INFO(g_LibDBLog) << "connect " << m_HostName << ":" << m_DBName << "@" << m_UserName << " error";
  68. DisConnect();
  69. return false;
  70. }
  71. }
  72. else
  73. {
  74. LOG_INFO(g_LibDBLog) << "connect " << m_HostName << ":" << m_DBName << "@" << m_UserName << " error";
  75. return false;
  76. }
  77. }
  78. void DBService::DisConnect()
  79. {
  80. if (NULL != m_Connect)
  81. {
  82. LOG_INFO(g_LibDBLog) << "close " << m_HostName << ":" << m_DBName << "@" << m_UserName;
  83. ProcessStop();
  84. DBOperator::DisConnect(m_Connect);
  85. m_Connect = NULL;
  86. }
  87. }
  88. }
  89. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/875278
推荐阅读
相关标签
  

闽ICP备14008679号