/
Shymer123
/
LumenServer
Обзор
Документация
Войти
/
Shymer123
/
LumenServer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Server/SourceFiles/Core/Infrastructure/DatabaseConnectionPool.cpp
76 строк
2 KB
Shymer123
Initial commit: LumenServer
20 июн 2026, 12:43
20 июн 2026, 12:43
173f14c
Код
Авторство
О чём код?
#include "DatabaseConnectionPool.h" namespace Core::Infrastructure { DatabaseConnectionPool::DatabaseConnectionPool(size_t poolSize, std::function<std::unique_ptr<Storage::Db::IDatabase>()> factory) : m_poolSize(poolSize), m_factory(factory) {} bool DatabaseConnectionPool::connect(const Core::Settings::DatabaseSettings& dbSettings) { std::lock_guard<std::mutex> lock(m_mutex); m_dbSettings = dbSettings; while(!m_pool.empty()) { m_pool.pop(); } for(size_t i = 0; i < m_poolSize; ++i) { auto conn = m_factory(); if(!conn->connect(dbSettings)) { while(!m_pool.empty()) { m_pool.pop(); } m_connected = false; return false; } m_pool.push(std::move(conn)); } m_connected = true; return true; } std::unique_ptr<Storage::Db::IDatabase> DatabaseConnectionPool::acquire() { std::unique_lock lock(m_mutex); m_cv.wait(lock, [this] { return !m_pool.empty(); }); if (!m_connected) { throw std::runtime_error("Connection pool is not connected"); } auto conn = std::move(m_pool.front()); m_pool.pop(); return conn; } void DatabaseConnectionPool::release(std::unique_ptr<Storage::Db::IDatabase> conn) { { std::lock_guard<std::mutex> lock(m_mutex); if(conn && m_connected) { m_pool.push(std::move(conn)); } else { auto newConn = m_factory(); if (newConn->connect(m_dbSettings)) { m_pool.push(std::move(newConn)); } } } m_cv.notify_one(); } } // namespace Core::Infrastructure