-
Notifications
You must be signed in to change notification settings - Fork 0
/
connection_pool.cc
105 lines (97 loc) · 2.42 KB
/
connection_pool.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "connection_pool.h"
#include "log.h"
ConnectionPool* ConnectionPool::GetInstance()
{
static ConnectionPool connPool;
return &connPool;
}
void ConnectionPool::init(string url,int port,string user,string password,string dbname,unsigned int maxconn)
{
this->url=url;
this->port=port;
this->user=user;
this->password=password;
this->databasename=dbname;
for (int i=0;i<maxconn;i++)
{
MYSQL* con=nullptr;
con=mysql_init(con);
if(con==nullptr)
{
LOG_ERROR("%s","mysql init error");
exit(1);
}
con=mysql_real_connect(con,url.c_str(),user.c_str(),password.c_str(),dbname.c_str(),port,nullptr,0);
if(con==nullptr)
{
LOG_ERROR("%s","mysql connect error");
exit(1);
}
conn_queue.push(con);
}
pthread_mutexattr_t mtx_attr;
pthread_mutexattr_init(&mtx_attr);
pthread_mutexattr_setpshared(&mtx_attr,PTHREAD_PROCESS_PRIVATE);
pthread_mutex_init(&mtx,&mtx_attr);
sem_init(&sem,0,maxconn);
}
ConnectionPool::~ConnectionPool()
{
//DestroyPool();
//locker.Lock();
pthread_mutex_lock(&mtx);
if(conn_queue.size()>0)
{
for(int i=0;i<conn_queue.size();i++)
{
MYSQL* con=conn_queue.front();
conn_queue.pop();
mysql_close(con);
}
}
//locker.Unlock();
pthread_mutex_unlock(&mtx);
pthread_mutex_destroy(&mtx);
sem_destroy(&sem);
}
MYSQL* ConnectionPool::GetConnection()
{
MYSQL* con=nullptr;
if(conn_queue.size()==0)
return nullptr;
sem_wait(&sem);
//locker.Lock();
pthread_mutex_lock(&mtx);
con=conn_queue.front();
conn_queue.pop();
pthread_mutex_unlock(&mtx);
//locker.Unlock();
return con;
}
bool ConnectionPool::ReleaseConnection(MYSQL* conn)
{
if(conn==nullptr)
return false;
//locker.Lock();
pthread_mutex_lock(&mtx);
conn_queue.push(conn);
//locker.Unlock();
pthread_mutex_unlock(&mtx);
sem_post(&sem);
}
/*void connection_pool::DestroyPool()
{
locker.Lock();
if(conn_queue.size()>0)
{
for(int i=0;i<conn_queue.size();i++)
{
MYSQL* con=conn_queue.front();
conn_queue.pop();
mysql_close(con);
}
locker.Unlock();
}
else
locker.Unlock();
}*/