database_controller.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /*
  2. * @Description: 数据库操作类
  3. * @Author: yct
  4. * @Date: 2020-07-14 14:09:35
  5. * @LastEditTime: 2020-07-18 23:57:10
  6. * @LastEditors: yct
  7. */
  8. #ifndef DATABASE_CONTROLLER_HH
  9. #define DATABASE_CONTROLLER_HH
  10. #include <mysql_driver.h>
  11. #include <mysql_connection.h>
  12. #include <cppconn/driver.h>
  13. #include <cppconn/exception.h>
  14. #include <cppconn/resultset.h>
  15. #include <cppconn/statement.h>
  16. #include "../tool/singleton.h"
  17. #include "../tool/thread_condition.h"
  18. #include "../error_code/error_code.h"
  19. #include "./database_communication_configuration.pb.h"
  20. #include <stdio.h>
  21. #include <mutex>
  22. #include <queue>
  23. #include <thread>
  24. #include <atomic>
  25. #include <unistd.h>
  26. #include <string.h>
  27. #include <iostream>
  28. #include <cstddef>
  29. #include <boost/shared_ptr.hpp>
  30. #include <proto_tool.h>
  31. #include <glog/logging.h>
  32. //数据库更新间隔毫秒
  33. #define DB_UPDATE_INTERVAL_MILLI 20000
  34. //胡力 数据库连接线路的默认个数 默认5个
  35. #define DB_CONNECT_QUEUE_SIZE 5
  36. //胡力 数据库尝试重新连接的次数 默认3次
  37. #define DB_RECONNECTION_NUMBER 3
  38. //胡力 数据库指令长度 1024*1024*2
  39. #define DB_SQL_SIZE 1048576
  40. #define DATABASE_COMMUNICATION_PARAMETER_PATH "database_communication.prototxt"
  41. class Database_controller : public Singleton<Database_controller>
  42. {
  43. // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
  44. friend class Singleton<Database_controller>;
  45. public:
  46. typedef struct DB_PARAM
  47. {
  48. std::string connect_string;
  49. std::string username;
  50. std::string pass;
  51. std::string db_name;
  52. } db_param;
  53. //huli 新增数据库的状态
  54. enum Database_controller_status
  55. {
  56. E_UNKNOWN = 0, //默认未知
  57. E_READY = 1, //正常待机
  58. E_DISCONNECT = 2, //断连
  59. E_FAULT = 3, //故障
  60. };
  61. struct Database_connect_channel
  62. {
  63. boost::shared_ptr< sql::Connection> mp_connect_channel;
  64. std::mutex m_occupancy_lock;
  65. };
  66. private:
  67. // 父类的构造函数必须保护,子类的构造函数必须私有。
  68. Database_controller() ;
  69. public:
  70. // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
  71. Database_controller(const Database_controller &) = delete;
  72. Database_controller &operator=(const Database_controller &) = delete;
  73. ~Database_controller();
  74. //初始化
  75. Error_manager database_controller_init();
  76. //从文本导入
  77. Error_manager database_controller_init_from_protobuf(std::string prototxt_path);
  78. Error_manager database_controller_init(std::string ip, int port, std::string username, std::string pass, std::string db_name, int conn_size=DB_CONNECT_QUEUE_SIZE);
  79. //反初始化
  80. Error_manager database_controller_uninit();
  81. Database_controller_status get_database_controller_status();
  82. Error_manager check_status();
  83. //数据库连接状态
  84. bool is_connected();
  85. //****** 增删改查功能 *******
  86. //增
  87. Error_manager sql_insert(std::string sql_str);
  88. //删
  89. Error_manager sql_delete(std::string sql_str);
  90. //改
  91. Error_manager sql_update(std::string sql_str);
  92. //查
  93. Error_manager sql_query(std::string sql_str, boost::shared_ptr< sql::ResultSet > &query_result);
  94. //控制语句 LOCK UNLOCK COMMIT 等
  95. Error_manager sql_control(std::string sql_str);
  96. private:
  97. // 守护线程,维持连接数量,以及自身状态更新
  98. void database_reconnect_thread();
  99. // 检查gengxin连接
  100. Error_manager updata_connect_channel();
  101. //创建补充 数据库连接的通路
  102. Error_manager fill_up_connect_channel();
  103. //zhan you jieyong
  104. Error_manager occupancy_connect_channel(boost::shared_ptr<Database_connect_channel> & p_database_connect_channel);
  105. //guihuan
  106. Error_manager giveback_connect_channel(boost::shared_ptr<Database_connect_channel> p_database_connect_channel);
  107. private:
  108. //huli 新增数据库的状态
  109. Database_controller_status m_database_controller_status;
  110. //数据库连接通路的集合
  111. std::list< boost::shared_ptr<Database_connect_channel> > m_database_connect_channel_list;
  112. //维持连接数量,以及自身状态更新条件变量
  113. Thread_condition m_database_reconnect_condition;
  114. //重连线程
  115. std::thread *mp_reconnect_thread;
  116. //连接池大小
  117. int m_conn_pool_size;
  118. //连接参数
  119. db_param m_db_param;
  120. };
  121. #endif // !DATABASE_CONTROLLER_HH