NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
database_pool.hpp
浏览该文件的文档.
1#ifndef NEFORCE_DATABASE_DATABASE_POOL_HPP__
2#define NEFORCE_DATABASE_DATABASE_POOL_HPP__
3
11
18NEFORCE_BEGIN_NAMESPACE__
19
25
42class NEFORCE_API database_pool {
43public:
48 struct pool_config {
49 size_t init_size = 5;
50 size_t min_size = 5;
51 size_t max_size = 64;
54 };
55
56private:
57 struct connection_entry {
58 idb_connect* conn = nullptr;
59 milliseconds idle_at{0};
60
61 connection_entry() noexcept = default;
62
63 explicit connection_entry(idb_connect* c) :
64 conn(c),
65 idle_at(current_ms()) {}
66
67 milliseconds idle_duration() const noexcept { return current_ms() - idle_at; }
68
69 static milliseconds current_ms() noexcept { return time_cast<milliseconds>(steady_clock::now().since_epoch()); }
70 };
71
72 db_config config_;
73 pool_config pool_cfg_;
74 unique_ptr<idb_factory> factory_;
75
76 queue<connection_entry> idle_queue_;
77 mutable mutex queue_mtx_;
78 condition_variable cv_;
79
80 atomic<size_t> total_count_{0};
81 atomic<bool> running_{false};
82
83 thread replenish_thread_;
84 thread scanner_thread_;
85
86 idb_connect* try_create_connect() noexcept;
87
88 void return_connect(idb_connect* conn);
89
90 void replenish_task();
91 void scanner_task();
92
93 template <typename T>
94 shared_ptr<T> acquire_impl();
95
96public:
102 database_pool(db_type type, const db_config& config) :
103 database_pool(type, config, pool_config()) {}
104
113
120
121 database_pool(const database_pool&) = delete;
122 database_pool& operator=(const database_pool&) = delete;
123 database_pool(database_pool&&) = delete;
124 database_pool& operator=(database_pool&&) = delete;
125
133
141
149
154 size_t idle_count() const noexcept;
155
160 size_t total_count() const noexcept;
161
166 bool is_running() const noexcept { return running_.load(memory_order_acquire); }
167
173 void stop();
174};
175
177template <typename T>
178shared_ptr<T> database_pool::acquire_impl() {
179 unique_lock<mutex> lk(queue_mtx_);
180
181 const bool got = cv_.wait_for(lk, pool_cfg_.acquire_timeout,
182 [this] { return !idle_queue_.empty() || !running_.load(memory_order_relaxed); });
183
184 if (!running_.load(memory_order_relaxed)) {
185 return nullptr;
186 }
187
188 if (!got || idle_queue_.empty()) {
189 const size_t cur = total_count_.load(memory_order_relaxed);
190 if (cur >= pool_cfg_.max_size) {
191 return nullptr;
192 }
193 idb_connect* raw = try_create_connect();
194 if (raw == nullptr) {
195 return nullptr;
196 }
197
198 total_count_.fetch_add(1, memory_order_relaxed);
199 T* typed = dynamic_cast<T*>(raw);
200 if (typed == nullptr) {
201 delete raw;
202 total_count_.fetch_sub(1, memory_order_relaxed);
203 return nullptr;
204 }
205 return shared_ptr<T>(typed, [this](T* p) { this->return_connect(p); });
206 }
207
208 const connection_entry entry = idle_queue_.front();
209 idle_queue_.pop();
210 lk.unlock_quiet();
211
212 idb_connect* raw = entry.conn;
213
214 if (!raw->is_valid()) {
215 if (!raw->reconnect(config_)) {
216 delete raw;
217 total_count_.fetch_sub(1, memory_order_relaxed);
218 cv_.notify_one();
219 return nullptr;
220 }
221 }
222
223 T* typed = dynamic_cast<T*>(raw);
224 if (typed == nullptr) {
225 this->return_connect(raw);
226 return nullptr;
227 }
228
229 return shared_ptr<T>(typed, [this](T* p) { this->return_connect(p); });
230}
232 // Database
234
235NEFORCE_END_NAMESPACE__
236#endif // NEFORCE_DATABASE_DATABASE_POOL_HPP__
原子类型完整实现
cv_status wait_for(unique_lock< mutex > &lock, const duration< Rep, Period > &rest)
等待指定的持续时间
void stop()
停止连接池
database_pool(db_type type, const db_config &config)
构造函数
size_t idle_count() const noexcept
获取空闲连接数
size_t total_count() const noexcept
获取总连接数
shared_ptr< idb_tb_connect > get_tb_connect()
获取关系型数据库连接
shared_ptr< idb_connect > get_connect()
获取通用数据库连接
shared_ptr< idb_kv_connect > get_kv_connect()
获取键值存储连接
bool is_running() const noexcept
检查连接池是否正在运行
database_pool(db_type type, const db_config &config, const pool_config &pool_config)
构造函数
~database_pool()
析构函数
共享智能指针类模板
独占锁管理器模板
条件变量行为
数据库抽象接口层
db_type
数据库类型枚举
duration< int64_t, milli > milliseconds
毫秒持续时间
constexpr ToDur time_cast(const duration< Rep, Period > &value)
持续时间类型转换
duration< int64_t > seconds
秒持续时间
NEFORCE_INLINE17 constexpr auto memory_order_relaxed
宽松内存顺序常量
NEFORCE_INLINE17 constexpr auto memory_order_acquire
获取内存顺序常量
队列容器适配器
共享智能指针实现
bool load(const memory_order mo=memory_order_seq_cst) const noexcept
原子加载操作
seconds max_idle_time
连接最大空闲时间
milliseconds acquire_timeout
获取连接超时时间
size_t init_size
初始连接数
数据库连接配置结构
数据库连接抽象基类
virtual bool reconnect(const db_config &config)=0
重新连接
virtual bool is_valid() const =0
检查连接有效性
static time_point now() noexcept
获取当前时间点
线程管理类