创建了vector保存固定数量的mysql链接,使用时取vector的, 暂时解了回收链接的问题。 而不是无限的新建

封了一层回收mysql链接的函数

解决了表面上的内存泄漏

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
This commit is contained in:
dongl 2023-05-13 14:27:10 +08:00
parent 67b7096053
commit 7b54e1449e
9 changed files with 101 additions and 61 deletions

View File

@ -6,7 +6,7 @@
#include <utility>
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;
}

View File

@ -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);

View File

@ -13,7 +13,7 @@
class analysis {
public:
analysis(std::shared_ptr<mp::mph>& mph, char* data) : m_mph(mph), m_data(data) {
analysis(std::shared_ptr<mp::mph>& mph, std::shared_ptr<mp::request>& request) : m_mph(mph), m_request(request) {
}
@ -21,17 +21,13 @@ public:
// agreement_request
auto agreementRequest = std::make_shared<agreement_request>(agreement_request());
// request
auto request = std::make_shared<mp::request>(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<mp::mph> m_mph;
char* m_data;
std::shared_ptr<mp::request> m_request;
};

View File

@ -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>(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>(agreement_response());
// 执行逻辑 自定义

View File

@ -12,6 +12,7 @@
/// curr mem user curd user session
void session::add_user(mp::sri* sri, std::shared_ptr<agreement_request>& 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));

View File

@ -9,6 +9,7 @@
// select user info
std::tuple<bool, PoUser> 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<bool, PoUser> UserDB::select_user(uint64_t account, const std::string
std::vector<im_user> 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<uint64_t> 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;
}

View File

@ -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<rapidjson::Document> UserFriendsDB::select_friends_all(uint64_t account) {
@ -54,6 +67,8 @@ std::optional<rapidjson::Document> 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<mp::MP_SRI, mp::MP_SRI, std::string> 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<uint64_t> 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, "找不到此类型的添加决策");
//}

View File

@ -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<mysqlpp::Connection*> link;
static std::atomic<int> 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);
}

View File

@ -6,10 +6,13 @@
#define IM2_LINKDB_H
#include "ConnectionPool.h"
#include <queue>
#include <atomic>
class LinkDB {
public:
static mysqlpp::Connection* safe_grab();
static void release(mysqlpp::Connection *connection);
private:
LinkDB();