From 7b54e1449eacdee6be826cde4ec7194b263e2838 Mon Sep 17 00:00:00 2001 From: dongl <2725096176@qq.com> Date: Sat, 13 May 2023 14:27:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=BA=86vector=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=9B=BA=E5=AE=9A=E6=95=B0=E9=87=8F=E7=9A=84mysql?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=97=B6=E5=8F=96?= =?UTF-8?q?vector=E7=9A=84,=20=E6=9A=82=E6=97=B6=E8=A7=A3=E4=BA=86?= =?UTF-8?q?=E5=9B=9E=E6=94=B6=E9=93=BE=E6=8E=A5=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82=20=E8=80=8C=E4=B8=8D=E6=98=AF=E6=97=A0=E9=99=90?= =?UTF-8?q?=E7=9A=84=E6=96=B0=E5=BB=BA=20=E5=B0=81=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E5=B1=82=E5=9B=9E=E6=94=B6mysql=E9=93=BE=E6=8E=A5=E7=9A=84?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决了表面上的内存泄漏 30个链接 在4MB 左右 而新建 返回到池 在2.5 左右 注:后续好好看一下 mysqlpp 的连接池内容 Grab a free connection from the pool. This method creates a new connection if an unused one doesn't exist, and destroys any that have remained unused for too long. If there is more than one free connection, we return the most recently used one; this allows older connections to die off over time when the caller's need for connections decreases. Do not delete the returned pointer. This object manages the lifetime of connection objects it creates. Return values a pointer to the connection --- MDB/imm_mysqldb/ConnectionPool.cpp | 4 +- MS/MS.cpp | 3 +- MS/mmm/analysis.h | 10 ++--- MS/mmm/management.cpp | 6 ++- MS/mmm/session.cpp | 1 + MS/works/db/UserDB.cpp | 54 ++++++++++++++++++++++----- MS/works/db/UserFriendsDB.cpp | 60 +++++++++++------------------- MS/works/db/linkDB.cpp | 21 ++++++++++- MS/works/db/linkDB.h | 3 ++ 9 files changed, 101 insertions(+), 61 deletions(-) diff --git a/MDB/imm_mysqldb/ConnectionPool.cpp b/MDB/imm_mysqldb/ConnectionPool.cpp index a30bad3..bf19b17 100644 --- a/MDB/imm_mysqldb/ConnectionPool.cpp +++ b/MDB/imm_mysqldb/ConnectionPool.cpp @@ -6,7 +6,7 @@ #include mysqlpp::Connection *ConnectionPool::create() { - return new mysqlpp::Connection( + return new mysqlpp::Connection( db_.empty() ? nullptr : db_.c_str(), server_.empty() ? nullptr : server_.c_str(), user_.empty() ? nullptr : user_.c_str(), @@ -18,7 +18,7 @@ void ConnectionPool::destroy(mysqlpp::Connection *connection) { } unsigned int ConnectionPool::max_idle_time() { - return 30; + return 1; } diff --git a/MS/MS.cpp b/MS/MS.cpp index 4f40470..266e82e 100644 --- a/MS/MS.cpp +++ b/MS/MS.cpp @@ -11,7 +11,8 @@ ev_pool* MS::pool = nullptr; -class management* MS::mage = nullptr; +management* MS::mage = nullptr; + MS::MS() { pool = new ev_pool(4); pool->add_event_base(listener); diff --git a/MS/mmm/analysis.h b/MS/mmm/analysis.h index 834eb7c..115896b 100644 --- a/MS/mmm/analysis.h +++ b/MS/mmm/analysis.h @@ -13,7 +13,7 @@ class analysis { public: - analysis(std::shared_ptr& mph, char* data) : m_mph(mph), m_data(data) { + analysis(std::shared_ptr& mph, std::shared_ptr& request) : m_mph(mph), m_request(request) { } @@ -21,17 +21,13 @@ public: // agreement_request auto agreementRequest = std::make_shared(agreement_request()); - // request - auto request = std::make_shared(mp::request()); - - request->ParseFromString(m_data); - agreementRequest->set(m_mph, request, bev, addr); + agreementRequest->set(m_mph, m_request, bev, addr); return agreementRequest; } private: std::shared_ptr m_mph; - char* m_data; + std::shared_ptr m_request; }; diff --git a/MS/mmm/management.cpp b/MS/mmm/management.cpp index b410b3e..b576c8e 100644 --- a/MS/mmm/management.cpp +++ b/MS/mmm/management.cpp @@ -92,8 +92,12 @@ void management::read_packet(bufferevent *bev, sockaddr_in *addr) { // 更新buffer长度 len_index -= mph->mpb_size(); + // request + auto req = std::make_shared(mp::request()); + req->ParseFromString(packet_b); + // 请求 - auto request = analysis(mph, packet_b)(bev, addr); + auto request = analysis(mph, req)(bev, addr); // 响应 auto response = std::make_shared(agreement_response()); // 执行逻辑 自定义 diff --git a/MS/mmm/session.cpp b/MS/mmm/session.cpp index 4be891a..8ff52c6 100644 --- a/MS/mmm/session.cpp +++ b/MS/mmm/session.cpp @@ -12,6 +12,7 @@ /// curr mem user curd user session void session::add_user(mp::sri* sri, std::shared_ptr& request) { if (sri->sri_code() == mp::MP_LOGIN_SUCCESS) { + printf("1111\n"); auto ele = new userinfo(); ele->bev = request->m_bev; sprintf(ele->ip, "%s", inet_ntoa(request->m_addr->sin_addr)); diff --git a/MS/works/db/UserDB.cpp b/MS/works/db/UserDB.cpp index 8157468..65a8fa0 100644 --- a/MS/works/db/UserDB.cpp +++ b/MS/works/db/UserDB.cpp @@ -9,6 +9,7 @@ // select user info std::tuple UserDB::select_user(uint64_t account, const std::string& by_field) { + // 取池链接 conn = LinkDB::safe_grab(); auto query = conn->query("select * from im_user where %2:field=%1:account;"); query.template_defaults[1] = account; @@ -18,6 +19,8 @@ std::tuple UserDB::select_user(uint64_t account, const std::string std::vector user; query.storein(user); + // 放回链接 +// LinkDB::release(conn); return {!user.empty(), user.empty() ? PoUser() : PoUser(user[0].account, user[0].phone, user[0].email, @@ -34,11 +37,16 @@ bool UserDB::select_user_exist(uint64_t account) { bool UserDB::insert_user(uint64_t account, const std::string &password, const std::string &password_salt, const std::string &client_info) { conn = LinkDB::safe_grab(); + auto query = conn->query(); mysqlpp::String info(client_info); query.insert(im_user(account, 0, "", "用户"+ std::to_string(account), password, password_salt, info)); - return query.exec(); + auto ret = query.exec(); + + // 放回链接 +// LinkDB::release(conn); + return ret; } // insert user friends info @@ -54,7 +62,11 @@ bool UserDB::insert_user_friends(uint64_t account, uint64_t friends) { q.template_defaults[3] = time(nullptr); q.parse(); - return q.exec(); + auto ret = q.exec(); + + // 放回链接 +// LinkDB::release(conn); + return ret; } bool UserDB::remove_user(uint64_t account) { @@ -63,7 +75,12 @@ bool UserDB::remove_user(uint64_t account) { query.template_defaults["account"] = account; query.parse(); - return query.exec(); + + auto ret = query.exec(); + + // 放回链接 +// LinkDB::release(conn); + return ret; } @@ -79,7 +96,11 @@ bool UserDB::test(uint64_t account) { q.template_defaults[3] = time(nullptr); q.parse(); - return q.exec(); + auto ret = q.exec(); + + // 放回链接 +// LinkDB::release(conn); + return ret; } @@ -94,6 +115,9 @@ std::optional UserDB::fetch_account() { return std::nullopt; } + + // 放回链接 +// LinkDB::release(conn); return std::strtol(ret[0][0], nullptr,0); } @@ -104,7 +128,11 @@ bool UserDB::remove_pool_account(uint64_t account) { query.template_defaults[1] = account; query.parse(); - return query.exec(); + auto ret = query.exec(); + + // 放回链接 +// LinkDB::release(conn); + return ret; } // 帐号 绑定邮箱 @@ -113,9 +141,13 @@ bool UserDB::bind_email(uint64_t account, const std::string &email) { auto query = conn->query("update im_user set email=%2q:email where account=%1:account"); query.template_defaults[1] = account; query.template_defaults[2] = email.c_str(); - query.parse(); - return query.exec(); + + auto ret = query.exec(); + + // 放回链接 +// LinkDB::release(conn); + return ret; } bool UserDB::bind_phone(uint64_t account, const std::string &phone) { @@ -123,9 +155,13 @@ bool UserDB::bind_phone(uint64_t account, const std::string &phone) { auto query = conn->query("update im_user set phone=%2q:email where account=%1:account"); query.template_defaults[1] = account; query.template_defaults[2] = phone.c_str(); - query.parse(); - return query.exec(); + + auto ret = query.exec(); + + // 放回链接 +// LinkDB::release(conn); + return ret; } diff --git a/MS/works/db/UserFriendsDB.cpp b/MS/works/db/UserFriendsDB.cpp index 57fe79b..b0b4d6c 100644 --- a/MS/works/db/UserFriendsDB.cpp +++ b/MS/works/db/UserFriendsDB.cpp @@ -13,7 +13,11 @@ char UserFriendsDB::select_add_type(uint64_t account) { query.parse(); // 查看添加授权类型 0 直接添加 1 验证问题 2 账户审核 - return query.store(account)[0][0][0]; // 因为 account 唯一 所以结果 至多一个 + auto ret = query.store(account)[0][0][0]; // 因为 account 唯一 所以结果 至多一个 + + // 放回链接 +// LinkDB::release(conn); + return ret; } // 修改好友列表数据 添加好友 @@ -31,11 +35,20 @@ bool UserFriendsDB::add_friends(uint64_t account, uint64_t friends) { query.template_defaults[1] = account; query.template_defaults[2] = friends; query.parse(); - return query.exec(); + + auto ret = query.exec(); + + // 放回链接 +// LinkDB::release(conn); + return ret; } void UserFriendsDB::insert_friends_to_be_added(uint64_t account, uint64_t friends) { conn = LinkDB::safe_grab(); + + + // 放回链接 +// LinkDB::release(conn); } std::optional UserFriendsDB::select_friends_all(uint64_t account) { @@ -54,6 +67,8 @@ std::optional UserFriendsDB::select_friends_all(uint64_t ac rapidjson::Document document; document.Parse(friends.c_str()); + // 放回链接 +// LinkDB::release(conn); return document; } @@ -83,48 +98,15 @@ UserFriendsDB::select_friends_info(uint64_t account, uint64_t friends) { rapidjson::Document document; document.Parse(friend_info.c_str()); + + + // 放回链接 +// LinkDB::release(conn); return document; } -//std::tuple UserFriendsDB::update_add_info(char type, mp::body *body) { -// // 如果是0 直接添加 -// if (type == '0') { -// auto temp_query = conn->query("update im_user_friends set friends=%1q:groups where account=%0:account"); -// temp_query.parse(); -// -// std::vector friends; -// friends.push_back(body->source()); -// auto ret1 = temp_query.execute(body->target(), vectorSerialization(friends)); -// -// friends.clear(); -// friends.push_back(body->target()); -// auto ret2 = temp_query.execute(body->source(), vectorSerialization(friends)); -// -// if (ret1.rows() < 1 || ret2.rows() < 1) { -// return std::make_tuple(mp::MP_ADD_FRIENDS_ERR, mp::MP_ADD_FRIENDS_SQL_ERR, "定位之于此 sql可能执行结果出错"); -// } -// return std::make_tuple(mp::MP_ADD_FRIENDS, mp::MP_ADD_FRIENDS_0, "添加成功"); -// } -// -// // 1 回答问题 -// else if (type == '1') { -// -// return std::make_tuple(mp::MP_ADD_FRIENDS, mp::MP_ADD_FRIENDS, "添加成功"); -// } -// // 2 被添加账户审核 -// else if (type == '2') { -//// auto temp_query = conn->query("select"); -// -// return std::make_tuple(mp::MP_ADD_FRIENDS, mp::MP_ADD_FRIENDS_2, "待同意"); -// } -// -// return std::make_tuple(mp::MP_ADD_FRIENDS_ERR, mp::MP_ADD_FRIENDS_NOT_TYPE, "找不到此类型的添加决策"); -//} - - - diff --git a/MS/works/db/linkDB.cpp b/MS/works/db/linkDB.cpp index 7cab1c2..a956da1 100644 --- a/MS/works/db/linkDB.cpp +++ b/MS/works/db/linkDB.cpp @@ -1,20 +1,37 @@ // // Created by dongl on 23-4-25. // + + #include "linkDB.h" LinkDB::LinkDB() {} + LinkDB::~LinkDB() { delete pool; } ConnectionPool* LinkDB::pool = nullptr; -mysqlpp::Connection* LinkDB::safe_grab() { +mysqlpp::Connection* LinkDB::safe_grab() { + static std::vector link; + static std::atomic index; if (pool == nullptr) { pool = new ConnectionPool("124.221.152.192", "ims", "IMS", "WimTFC8N58kznx2k"); + index = -1; + for (int i = 0; i < 30; ++i) { + link.push_back(pool->safe_grab()); + } } - return pool->safe_grab(); + ++index; + if (index >= link.size()) { + index = 0; + } + return link[index]; +} + +void LinkDB::release(mysqlpp::Connection *connection) { + pool->release(connection); } diff --git a/MS/works/db/linkDB.h b/MS/works/db/linkDB.h index 98e14e4..5bed9f0 100644 --- a/MS/works/db/linkDB.h +++ b/MS/works/db/linkDB.h @@ -6,10 +6,13 @@ #define IM2_LINKDB_H #include "ConnectionPool.h" +#include +#include class LinkDB { public: static mysqlpp::Connection* safe_grab(); + static void release(mysqlpp::Connection *connection); private: LinkDB();