日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql c 多线程封装_mysqlConnectorC/C++多线程封装_MySQL

發(fā)布時間:2024/1/23 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql c 多线程封装_mysqlConnectorC/C++多线程封装_MySQL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

bitsCN.com

mysql Connector C/C++ 多線程封裝

在網(wǎng)上找了好久,有很多封裝,但是感覺對多線程處理的不多,都不是很理想。封裝完的第一個版本,想法比較簡單,使用一個單例模式,對應一個連接,多線程查詢的時候都是在這個鏈接上完成,如下簡略代碼class DbClass{public: open(....) { mysql_real_connect(mDB); } QuerySQL(....) { mysql_real_query(mDB); } protected: MYSQL* mDB;}

但實際使用中發(fā)現(xiàn)只要多線程一開就報錯,一般就是lost connect之類的錯誤,開始以為就是單純的連接斷開,所以在連接上面做了一些文章,每次查詢的時候使用ping確定連接是否正常,具體ping怎么寫我這里就不贅述了,網(wǎng)上有很多文章,加完了Ping,對連接設立了超時時間依然不能解決問題。

查了一下文檔發(fā)現(xiàn)在使用多線程時mysql_real_query函數(shù)和mysql_store_result函數(shù)必須加鎖,由于ping有可能造成連接重連,因此在ping里面也加上了鎖,如下代碼class DbClass{public: open(....) { mysql_real_connect(mDB); }

ping()

{

mutex.lock();

mysql_ping();

mutex.unlock();

}

QuerySQL(....) { mutex.lock(); mysql_real_query(mDB); mutex.unlock(); } protected: MYSQL* mDB;}

這次再試終于不報錯了,高興了好長時間,這段代碼也就沒有再看,代碼測試到最后的時候,加上了計時等性能測量就發(fā)現(xiàn)問題了,多線程和單線程的用時一樣。。。。問題很明顯,這個其實就是串行訪問數(shù)據(jù)庫的,實質(zhì)上還是單線程。而且即使單線程由于加的鎖比較多,速度也并不快。

重新思考了下,單連接上的多線程貌似肯定是不行了,一個連接同一時刻只能處理一個線程,想明白就好辦了,改成每個線程對應一個連接就OK了,而且這樣改由于連接并非共享資源,也不需要加互斥,會大大提高效率。class DbClass{public: MYSQL*open(....) {

MYSQL* pDB; mysql_real_connect(pDB);

return pDB; } ping(MYSQL* pDB) { mysql_ping(pDB); } QuerySQL(MYSQL* pDB, .....) { mysql_real_query(pDB); }

close(MYSQL* pDB)

{

mysql_close(pDB);

}}

work_thread()

{

MYSQL* pDB = DbClass::open(); //應該是單例,這里就用static示意一下

.....

DbClass::ping(pDB);

DbClass::QuerySQL(pDB);

.....

DbClass::close(pDB);

}

改完之后效果很明顯啊,單線程處理8000條數(shù)據(jù)(還有各種計算)大概要30秒,10線程處理只要3秒多一點,甚是欣慰。而且,原先由于鎖比較多單線程處理1000條數(shù)據(jù)大概也要20秒,現(xiàn)在8000要30秒,提高了很多了,還有優(yōu)化的地方,不過已經(jīng)滿足需要了,就這樣吧。

總結一下,mysql多線程的封裝需要注意如下幾點

1. 查詢前要先Ping確保連接正常

2. 每個線程對應一個連接

3. 若線程的刪除和建立比較頻繁,需要在獲取連接時使用連接池。

bitsCN.com

本條技術文章來源于互聯(lián)網(wǎng),如果無意侵犯您的權益請點擊此處反饋版權投訴

本文系統(tǒng)來源:php中文網(wǎng)

TAG標簽:多線程網(wǎng)上

總結

以上是生活随笔為你收集整理的mysql c 多线程封装_mysqlConnectorC/C++多线程封装_MySQL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。