展开全部
类似一下的代码写和调用即可。
mysql示例如下:
#pragma once
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class mysql_conn_pool : public std::enable_shared_from_this, private boost::noncopyable
{
public:
mysql_conn_pool();
mysql_conn_pool(const string &host,const unsigned int port,const string & db,const string& user,const string & pwd,const size_t& psize);
~mysql_conn_pool();
MYSQL * pop_client();
MYSQL * pop_client(const string& db);
void push(MYSQL* mysql);
bool create_db(const string& sql);
bool get_init_suc();
private:
int timeout;
size_t pool_size;
list m_list;
string s_db;
unsigned int ui_port;
string s_user;
string s_pwd;
string str_host;
bool b_suc;
};
typedef std::shared_ptr mysql_conn_pool_ptr;
#include "mysql_conn_pool.h"
typedef boost::unique_lock<:shared_mutex> writeLock;
typedef boost::shared_lock<:shared_mutex> readLock;
boost::shared_mutex m_lock;
mysql_conn_pool::mysql_conn_pool()
{
timeout =5000;
m_list.clear();
}
mysql_conn_pool::mysql_conn_pool(const string &host, const unsigned int port, const string & db, const string& user, const string & pwd, const size_t& psize)
:str_host(host), ui_port(port), s_db(db), s_user(user), s_pwd(pwd), pool_size(psize)
{
if (!mysql_library_init(0, NULL, NULL)) {
fprintf(stderr, "could not initialize MySQL library\n");
}
}
mysql_conn_pool::~mysql_conn_pool()
{
writeLock mlock(m_lock);
for (auto x : m_list)
{
mysql_close(x);
}
mysql_library_end();
}
MYSQL * mysql_conn_pool::pop_client()
{
writeLock mlock(m_lock);
MYSQL * mysql = NULL;
if (m_list.size() == 0)
{
char value = 1;
mysql = mysql_init(NULL);
if (mysql != NULL && mysql_real_connect(mysql, str_host.c_str(), s_user.c_str(), s_pwd.c_str(), s_db.c_str(), ui_port, NULL, 0) == NULL)
{
fprintf(stderr, "%s\n", mysql_error(mysql));
}
else if (mysql != NULL)
{
mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, &timeout);
mysql_set_character_set(mysql, "utf8");
mysql_set_server_option(mysql, MYSQL_OPTION_MULTI_STATEMENTS_ON);
mysql_options(mysql, MYSQL_OPT_RECONNECT, (char *)&value);
}
}
else
{
mysql = m_list.front();
m_list.pop_front();
}
return mysql;
}
bool mysql_conn_pool::create_db(const string& sql)
{
writeLock mlock(m_lock);
MYSQL * mysql = NULL;
bool res = true;
{
char value = 1;
mysql = mysql_init(NULL);
if (mysql!=NULL && mysql_real_connect(mysql, str_host.c_str(), s_user.c_str(), s_pwd.c_str(), s_db.c_str(), ui_port, NULL, 0) == NULL)
{
fprintf(stderr, "%s\n", mysql_error(mysql));
res = false;
}
else if (mysql != NULL )
{
int res = mysql_query(mysql, sql.c_str());
if (res != 0)
{
res = false;
std::cout << mysql_error(mysql) << endl;
}
mysql_close(mysql);
}
}
return res;
}
MYSQL * mysql_conn_pool::pop_client(const string& db)
{
writeLock mlock(m_lock);
MYSQL * mysql = NULL;
if (m_list.size() == 0)
{
char value = 1;
mysql = mysql_init(NULL);
if (mysql != NULL && mysql_real_connect(mysql, str_host.c_str(), s_user.c_str(), s_pwd.c_str(), s_db.c_str(), ui_port, NULL, 0) == NULL)
{
fprintf(stderr, "%s\n", mysql_error(mysql));
b_suc = false;
}
else if (mysql != NULL)
{
b_suc = true;
int res = mysql_select_db(mysql, db.c_str());
if (res != 0)
{
fprintf(stderr, "%s\n", mysql_error(mysql));
return NULL;
}
mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, &timeout);
mysql_set_character_set(mysql, "utf8");
mysql_set_server_option(mysql, MYSQL_OPTION_MULTI_STATEMENTS_ON);
mysql_options(mysql, MYSQL_OPT_RECONNECT, (char *)&value);
}
}
else
{
mysql = m_list.front();
int res = mysql_select_db(mysql, db.c_str());
if (res != 0)
{
fprintf(stderr, "%s\n", mysql_error(mysql));
return NULL;
}
m_list.pop_front();
}
return mysql;
}
void mysql_conn_pool::push(MYSQL* mysql)
{
writeLock mlock(m_lock);
m_list.push_back(mysql);
//清理多余的链接62616964757a686964616fe59b9ee7ad9431333363353739
if (m_list.size() > pool_size)
{
size_t s_t = 0;
for (auto x : m_list)
{
s_t++;
if (s_t > pool_size)
{
mysql_close(x);
}
}
}
}
bool mysql_conn_pool::get_init_suc()
{
readLock mlock(m_lock);
return b_suc;
}
本回答由网友推荐
已赞过
已踩过<
你对这个回答的评价是?
评论
收起