思想:封裝mysql基本操作api,以stl中的list容器包裝連線物件,採用單例模式建立連線池類物件,採取raii機制進行實現。其中,涉及到對連線佇列的操作的,全部都加上互斥鎖,保證原子操作。
具體的,pool類成員變數包括:
主機名或ip位址m_url,如果null或"localhost",連線將被視為與本地主機的連線。
資料庫名稱m_dbname、
登入使用者名稱m_dbuser、
使用者密碼m_dbpswd、
連線埠m_port,
當前連線數m_curconn、
空閒連線數m_freeconn以及乙個封裝了互斥量的locker類物件lock,封裝了訊號量的sem類物件rest。
主要介面有:
初始化介面init,
獲取空閒連線數介面getfreeconn,
釋放乙個連線介面releaseconn,
銷毀連線池介面destroy以及
單例模式獲取唯一例項介面getinstance。
最後,raiipool類實現raii機制,在建構函式中獲取唯一例項,析構函式銷毀連線池。
**如下
#pragma once
class
pool
;//真正實現raii - 建立物件即獲得乙個連線, 析構函式則釋放資源
class
raiipool
;
具體實現:
pool::
pool()
pool::
~pool()
int pool::
getfreeconn()
bool pool::
init
(string url, string dbname, string dbpswd, string dbuser,
int port)
conn =
mysql_real_connect
(conn, url.
c_str()
, dbuser.
c_str()
, dbpswd.
c_str()
, dbname.
c_str()
, port,
null,0
);if(conn ==
null
)
pool_.
push_back
(conn)
;++m_freeconn;
} rest =
sem(m_freeconn)
;return
true;}
void pool::
destroy()
m_curconn =0;
m_freeconn =0;
pool_.
clear()
;//清空list
list>()
.swap
(pool_)
;//釋放資源
lock.
unlock()
;}mysql* pool::
getconn()
lock.
lock()
; rest.
wait()
;//訊號量-1
mysql* conn = pool_.
front()
;//取出乙個連線
pool_.
pop_front()
;--m_freeconn;
++m_curconn;
lock.
unlock()
;return conn;
}void pool::
releaseconn
(mysql* conn)
lock.
lock()
; pool_.
push_back
(conn)
;//放進空閒鏈結佇列
++m_freeconn;
--m_curconn;
rest.
post()
;//訊號量+1
lock.
unlock()
;}pool* pool::
getinstance()
raiipool::
raiipool
(mysql*
* conn ,pool* pool_)
raiipool::
~raiipool()
locker類實現:
class
locker}~
locker()
bool
lock()
bool
unlock()
pthread_mutex_t*
getmtx()
private
: pthread_mutex_t mtx;};
class
sem}
sem()}
~sem()
bool
wait()
bool
post()
private
: sem_t id;
};
2020 04 27 設計乙個連線池
此答案來自群員,感謝群員支援。有些題目,表面叫你設計乙個連線池,背地裡想考你連線池的原理。面試官你好,如果讓我設計乙個連線池,首先我會設計乙個 核心執行緒數 用來常駐記憶體中,迅速響應任務進行。再設計乙個 最大可擴充套件執行緒數 用來當任務增多的時候最多擴充套件執行緒的數量,當達到最大執行緒數的時候...
如何實現乙個連線池?
目錄前言 什麼是連線池?為什麼需要連線池?怎樣做乙個連線池?高階連線池 推薦原始碼 2w1h 是技術領域中一種非常有效的思考和學習方式,即what why和how 堅持 2w1h 可以快速提公升我們的深度思考能力。今天我們通過 2w1h 方式來討論 連線池 什麼是連線池 what 為什麼需要連線池 ...
實現乙個redis連線池
jedis連線引數設定 redis伺服器ip redis.ip 169.254.130.122 redis伺服器端口號 redis.port 6379 redis訪問密碼 redis.password test123 與伺服器建立連線的超時時間 redis.timeout 3000 jedis池引數...