c 實現資料庫連線池

2021-10-14 15:35:38 字數 2999 閱讀 9293

自己嘗試用c++ 新標準實現了資料庫連線池,**簡化了很多。

思路:

將資料庫的連線當作乙個物件新增進list佇列中,在連線池建立的時候就建立好佇列,並新增自定義大小的連線物件,連線物件用智慧型指標來管理(現代c++中不應該出現delete語句),避免類似記憶體洩漏等記憶體問題,智慧型指標上用lambda表示式註冊了delete刪除函式來釋放連線資源,及時歸還,(其中用了std::move來轉移list中的物件所有權到函式裡的臨時智慧型指標物件,當離開作用域時,自動釋放。)

關於資料庫連線池介紹可以看下面兩篇文章:

**資料庫連線池(一)

**資料庫連線池(二)

mysql_connect.h

#ifndef _mysql_connection_

#define _mysql_connection_

//c++

#include #include #include #include #include //mysql driver

#include #include //mysql execute

#include #include #include #include #include //thread mutex

#include using namespace sql;

using delfunc = std::function;

class connectionpool

;#endif

mysql_connect.cpp

#include #include #include #include "mysql_connect.h"

connectionpool*

connectionpool::pool = nullptr;

//private

//建構函式

connectionpool::connectionpool(std::string name, std::string pwd, std::string nurl, int maxsize):

username(name), password(pwd), url(nurl), poolsize(maxsize)

//析構函式

connectionpool::~connectionpool()

//得到連線池大小

intconnectionpool::getpoolsize()

//增加連線

void

connectionpool::addconn(int size)

); conlist.push_back(std::move(sp));

}}//初始化連線池

void

connectionpool::initconnectpool(int initialsize)

//銷毀乙個連線

void

connectionpool::destoryoneconn()

//銷毀整個連線池

void

connectionpool::destorypool()

}//擴大連線池

void

connectionpool::expandpool(int size)

//縮小連線池

void

connectionpool::reducepool(int size)

for(int i = 0; i < size; i++)

poolsize -= size;

}//public

//得到連線池例項

connectionpool*

connectionpool::getinstance()

return pool;

}//得到乙個連線

std::shared_ptrconnectionpool::getconnect()

//歸還乙個連線

void

connectionpool::retconnect(std::shared_ptr&ret)

try.cpp

#include #include #include #include #include connectionpool *pool = connectionpool::getinstance();

int main(int argc, char *ar**)

sleep(10);

pool->retconnect(con);

std::cout << pool->getpoolsize() << std::endl;

sleep(10);

return exit_success;

}

我自己進行了測試,建立資料庫連線池,呼叫乙個物件,然後執行資料庫連線,查詢出了結果,然後歸還乙個連線。

建立連線池前

建立連線池後

id 792是我呼叫的那個連線,然後執行查詢操作,所以db顯示的是連線上xl_db。

這個是自己寫的乙個簡單的資料庫連線池,可以參考下,如果要使用的話還需要自己改改。

這些××池之類,比如執行緒池,程序池,連線池等原理都差不多,就是先建立一批物件,然後乙個佇列裡儲存,需要的時候來取,用完歸還就行,然後通過c++11新特性等我們能提公升效能和安全性以及程式的簡介性,比如剛才說的std::move和智慧型指標,lambda等。

c 實現資料庫連線池

自己嘗試用c 新標準實現了資料庫連線池,簡化了很多。思路 將資料庫的連線當作乙個物件新增進list佇列中,在連線池建立的時候就建立好佇列,並新增自定義大小的連線物件,連線物件用智慧型指標來管理 現代c 中不應該出現delete語句 避免類似記憶體洩漏等記憶體問題,智慧型指標上用lambda表示式註冊...

資料庫連線池 Redis連線池

基本原理 在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。如外部使用者可通過getconnection方法獲取資料庫連線,使用完畢後再通過releaseconnection方法將連線返回,注意此時的連線並沒有關閉,而是由連線池管理器 並為下一次使用做好準備。2.作用 ...

資料庫連線池

實現資料連線池,讓系統有更高有執行效率 using system using system.data using system.data.sqlclient using system.collections using system.threading public class dataaccess...