• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

mysql Connector C/C++ 多线程封装_MySQL

mysql 搞代码 4年前 (2022-01-09) 13次浏览 已收录 0个评论

gaodaima.com

mysql Connector C/C++ 多线程封装

在网上找了好久,有很多封装,但是感觉对多线程处理的不多,都不是很理想。封装完的第一个版本,想法比较简单,使用一个单例模式,对应一个连接,多线程查询的时候都是在这个链接上完成,如下简略代码

class DbClass{public:     open(....)    {           mysql_real_connect(mDB);     }            QuerySQL(....)    {            mysql_real_query(mDB);     } protected:      MYSQL* mDB;}

但实际使用中发现只要多线程一开就报错,一般就是lost connect之类的错误,开始以为就是单纯的连接断开,所以在连接上面做了一些文章,每次查询的时候使用ping确定连接是否正常,具体ping怎么写我这里就不赘述了,网上有很多文章,加完了Ping,对连接设立了超时时间依然不能解决问题。

查了一下文档发现在使用多线程时mysql_real_query函数和mysql_store_result函数必须加锁,由于ping有可能造成连接重连,因此在ping里面也加上了锁,如下代码

class DbClass{public:     open(....)    {           mysql_real_connect(mDB);     }           <br />     ping()<br />     {<br />         mutex.lock();<br />         mysql_ping();<br />         mutex.unlock();<br />     }<br />     QuerySQL(....)    {           mutex.lock();           mysql_real_query(mDB);          mutex.unlock();     } protected:      MYSQL* mDB;}<br />

这次再试终于不报错了,高兴了好长时间,这段代码也就没有再看,代码测试到最后的时候,加上了计时等性能测量就发现问题了,多线程和单线程本文来源gao@daima#com搞(%代@#码@网2的用时一样。。。。问题很明显,这个其实就是串行访问数据库的,实质上还是单线程。而且即使单线程由于加的锁比较多,速度也并不快。
重新思考了下,单连接上的多线程貌似肯定是不行了,一个连接同一时刻只能处理一个线程,想明白就好办了,改成每个线程对应一个连接就OK了,而且这样改由于连接并非共享资源,也不需要加互斥,会大大提高效率。

class DbClass{public:     MYSQL*open(....)    {<br />          MYSQL* pDB;           mysql_real_connect(pDB);<br />          return pDB;     }                ping(MYSQL* pDB)     {         mysql_ping(pDB);     }     QuerySQL(MYSQL* pDB, .....)    {            mysql_real_query(pDB);     } <br /><br />  close(MYSQL* pDB)<br />   {<br />    mysql_close(pDB);<br />    }}<br /><br />work_thread()<br />{<br />  MYSQL* pDB = DbClass::open();  //应该是单例,这里就用static示意一下<br />   <br />    .....<br />    DbClass::ping(pDB);<br />    DbClass::QuerySQL(pDB);<br />    .....<br />    DbClass::close(pDB);<br />}<br />

改完之后效果很明显啊,单线程处理8000条数据(还有各种计算)大概要30秒,10线程处理只要3秒多一点,甚是欣慰。而且,原先由于锁比较多单线程处理1000条数据大概也要20秒,现在8000要30秒,提高了很多了,还有优化的地方,不过已经满足需要了,就这样吧。

总结一下,mysql多线程的封装需要注意如下几点

1. 查询前要先Ping确保连接正常

2. 每个线程对应一个连接

3. 若线程的删除和建立比较频繁,需要在获取连接时使用连接池。

gaodaima.com


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql Connector C/C++ 多线程封装_MySQL

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址