46 lines
1.2 KiB
C++
46 lines
1.2 KiB
C++
|
|
#include <vector>
|
|
#include <queue>
|
|
#include <mutex>
|
|
#include <condition_variable>
|
|
|
|
class ConnectionPool {
|
|
public:
|
|
ConnectionPool(size_t poolSize) : maxPoolSize(poolSize) {
|
|
for (size_t i = 0; i < maxPoolSize; ++i) {
|
|
connections.push(new Database());
|
|
}
|
|
}
|
|
|
|
~ConnectionPool() {
|
|
while (!connections.empty()) {
|
|
delete connections.front();
|
|
connections.pop();
|
|
}
|
|
}
|
|
|
|
Database* getConnection() {
|
|
std::unique_lock<std::mutex> lock(mutex);
|
|
while (connections.empty()) {
|
|
condition.wait(lock);
|
|
}
|
|
Database* conn = connections.front();
|
|
connections.pop();
|
|
std::cout << "Pool " << __func__ << " ok" << std::endl;
|
|
return conn;
|
|
}
|
|
|
|
void returnConnection(Database* conn) {
|
|
std::unique_lock<std::mutex> lock(mutex);
|
|
connections.push(conn);
|
|
condition.notify_one();
|
|
std::cout << "Pool " << __func__ << " ok" << std::endl;
|
|
}
|
|
|
|
private:
|
|
std::queue<Database*> connections; // 连接队列
|
|
size_t maxPoolSize; // 最大连接池大小
|
|
std::mutex mutex; // 互斥锁
|
|
std::condition_variable condition; // 条件变量
|
|
};
|