创建了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:
parent
67b7096053
commit
7b54e1449e
@ -18,7 +18,7 @@ void ConnectionPool::destroy(mysqlpp::Connection *connection) {
|
||||
}
|
||||
|
||||
unsigned int ConnectionPool::max_idle_time() {
|
||||
return 30;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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());
|
||||
// 执行逻辑 自定义
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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, "找不到此类型的添加决策");
|
||||
//}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,9 +1,12 @@
|
||||
//
|
||||
// Created by dongl on 23-4-25.
|
||||
//
|
||||
|
||||
|
||||
#include "linkDB.h"
|
||||
|
||||
LinkDB::LinkDB() {}
|
||||
|
||||
LinkDB::~LinkDB() {
|
||||
delete pool;
|
||||
}
|
||||
@ -11,10 +14,24 @@ LinkDB::~LinkDB() {
|
||||
ConnectionPool* LinkDB::pool = nullptr;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user