feat: mysql connection pool..
in progress
This commit is contained in:
parent
31b4763bc3
commit
5011fb6fb4
3 changed files with 151 additions and 92 deletions
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue