feat: mysql connection pool..

in progress
This commit is contained in:
bumpsoo 2026-02-08 18:04:12 +09:00
parent 31b4763bc3
commit 5011fb6fb4
3 changed files with 151 additions and 92 deletions

View file

@ -2,10 +2,13 @@
#include <boost/asio.hpp>
#include <boost/asio/awaitable.hpp>
#include <boost/asio/ssl.hpp>
#include <boost/mysql.hpp>
#include <deque>
#include <memory>
#include <queue>
#include <string>
#include <vector>
class DatabaseManager {
public:
@ -33,24 +36,60 @@ public:
uint64_t myValue;
};
class ConnectionProxy {
public:
ConnectionProxy(std::unique_ptr<boost::mysql::tcp_ssl_connection> conn,
DatabaseManager &owner)
: conn_(std::move(conn)), owner_(owner) {}
~ConnectionProxy();
// Move only
ConnectionProxy(ConnectionProxy &&other) noexcept
: conn_(std::move(other.conn_)), owner_(other.owner_) {}
ConnectionProxy &operator=(ConnectionProxy &&other) noexcept {
if (this != &other) {
conn_ = std::move(other.conn_);
}
return *this;
}
ConnectionProxy(const ConnectionProxy &) = delete;
ConnectionProxy &operator=(const ConnectionProxy &) = delete;
boost::mysql::tcp_ssl_connection *operator->() { return conn_.get(); }
boost::mysql::tcp_ssl_connection &operator*() { return *conn_; }
private:
std::unique_ptr<boost::mysql::tcp_ssl_connection> conn_;
DatabaseManager &owner_;
};
boost::asio::awaitable<UserData> LoadUser(std::string nickname);
boost::asio::awaitable<void> SaveUser(std::string nickname, uint64_t gold,
uint32_t swordLevel);
boost::asio::awaitable<RankingResult> GetRanking(int type,
std::string nickname);
boost::asio::awaitable<ConnectionProxy> GetConnection();
private:
DatabaseManager() = default;
// 비동기 Mutex 역할을 할 함수들
boost::asio::awaitable<void> Lock();
void Unlock();
void ReturnConnection(std::unique_ptr<boost::mysql::tcp_ssl_connection> conn);
boost::asio::awaitable<std::unique_ptr<boost::mysql::tcp_ssl_connection>>
CreateNewConnection();
std::unique_ptr<boost::mysql::tcp_ssl_connection> conn_;
std::deque<std::unique_ptr<boost::mysql::tcp_ssl_connection>> pool_;
std::queue<std::shared_ptr<boost::asio::steady_timer>> waiting_queue_;
boost::asio::io_context *io_context_ = nullptr;
std::unique_ptr<boost::asio::strand<boost::asio::io_context::executor_type>>
strand_;
// 비동기 락 시스템을 위한 상태 변수
bool is_locked_ = false;
std::queue<std::shared_ptr<boost::asio::steady_timer>> waiting_queue_;
boost::asio::ssl::context ssl_ctx_{boost::asio::ssl::context::tlsv12_client};
std::string host_, user_, password_, db_;
uint16_t port_;
uint32_t max_connections_ = 10;
uint32_t current_total_connections_ = 0;
};