1#ifndef MSTL_DATABASE_DATABASE_POOL_HPP__
2#define MSTL_DATABASE_DATABASE_POOL_HPP__
3#include "../core/container/queue.hpp"
8#include "db_interface.hpp"
11class MSTL_API database_pool {
16 size_t max_idle_time_;
17 size_t connect_timeout_;
19 _MSTL unique_ptr<idb_factory> factory_ =
nullptr;
20 _MSTL queue<idb_connect*> connect_queue_;
21 _MSTL mutex queue_mtx_;
22 _MSTL condition_variable cv_;
23 _MSTL atomic<bool> running_{
false};
25 _MSTL thread produce_;
26 _MSTL thread scanner_;
28 void produce_connect_task();
29 void scanner_connect_task();
32 shared_ptr<T> get_connect_impl();
35 database_pool(DB_TYPE type,
const db_config& config,
36 size_t init_size = 50,
size_t max_size = 1024,
37 size_t max_idle_time = 30,
size_t connect_timeout = 100);
39 ~database_pool() { stop(); }
41 database_pool(
const database_pool&) =
delete;
42 database_pool& operator =(
const database_pool&) =
delete;
43 database_pool(database_pool&&) =
delete;
44 database_pool& operator =(database_pool&&) =
delete;
48 _MSTL shared_ptr<idb_connect> get_connect() {
49 return get_connect_impl<idb_connect>();
51 _MSTL shared_ptr<idb_tb_connect> get_tb_connect() {
52 return get_connect_impl<idb_tb_connect>();
54 _MSTL shared_ptr<idb_kv_connect> get_kv_connect() {
55 return get_connect_impl<idb_kv_connect>();
64 while (connect_queue_.empty() && running_) {
66 if (connect_queue_.empty()) {
67 if (connect_queue_.size() < max_size_) {
68 auto* new_conn = factory_->create_connect();
69 if (new_conn !=
nullptr) {
70 new_conn->refresh_alive();
71 connect_queue_.push(new_conn);
80 idb_connect* raw_conn = connect_queue_.front();
83 if (!raw_conn->is_valid()) {
85 if (!raw_conn->reset_connect(config_)) {
87 raw_conn = factory_->create_connect();
88 if (raw_conn ==
nullptr) {
101 dynamic_cast<T*
>(raw_conn),
106 connect_queue_.push(p);
duration< int64_t, milli > milliseconds
毫秒持续时间
lock< Mutex, true > smart_lock
智能锁管理器的便捷类型别名
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL