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

From: http://blog.csdn.net/educast/article/details/14163519

 

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

复制代码
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);
}       
ping()
{
mutex.lock();
mysql_ping();
mutex.unlock();
}
QuerySQL(....)
{ 
mutex.lock();
mysql_real_query(mDB);
mutex.unlock();
} 
protected:
MYSQL* mDB;
}
复制代码

这次再试终于不报错了,高兴了好长时间,这段代码也就没有再看,代码测试到最后的时候,加上了计时等性能测量就发现问题了,多线程和单线程的用时一样。。。。问题很明显,这个其实就是串行访问数据库的,实质上还是单线程。而且即使单线程由于加的锁比较多,速度也并不快。
重新思考了下,单连接上的多线程貌似肯定是不行了,一个连接同一时刻只能处理一个线程,想明白就好办了,改成每个线程对应一个连接就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条数据(还有各种计算)大概要30秒,10线程处理只要3秒多一点,甚是欣慰。而且,原先由于锁比较多单线程处理1000条数据大概也要20秒,现在8000要30秒,提高了很多了,还有优化的地方,不过已经满足需要了,就这样吧。

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app微信小程序image引入图片;background-image背景图引入图片;小程序预览本地图片;小程序图片过大引入报错;获取本地图片的网络地址;

uni-app小程序图片使用有image标签和background-image背景图两种方式: 下有获取本地图片的网络地址方式:见第四步 一、方式一:使用image标签引入: uni-app官方image 1.官方文档说:src 仅支持相对路径、绝对路径&…

微商小程序加人加粉推广平台二维码

微商加人推广平台丨微商加粉推广平台丨微商拼团丨微商产品推广。

JS node 后端签名前端文件直传ali-oss解决方案

1&#xff1a;首先打开跨域 上面搞好了开始写代码 html <input type"file" id"upload" onchange"uploadfile()"> js function uploadfile() {var file document.getElementById(upload).files[0]$.ajax({url: /policy,data: ,type: get…

【MCAL】TC397+EB-treso之MCU配置实战 - 芯片时钟

本篇文章介绍了在TC397平台使用EB-treso对MCU驱动模块进行配置的实战过程&#xff0c;主要介绍了后续基本每个外设模块都要涉及的芯片时钟部分&#xff0c;帮助读者了解TC397芯片的时钟树结构&#xff0c;在后续计算配置不同外设模块诸如通信速率&#xff0c;定时器周期等&…

ubuntu下安装、卸载软件

2019独角兽企业重金招聘Python工程师标准>>> 安装&#xff1a;(1) apt-get install name 卸载&#xff1a;(1) apt-get remove name 卸载并清除配置&#xff1a;(1) apt-get remove --purge name 更新信息库&#xff1a;apt-get update 系统升级&#xff1a;apt-get…

英文版Ubuntu 安装中文输入法

一、安装语言包 &#xff08;系统默认会安装中文简体语言包&#xff09; System Settings-->Language Support-->Install/Remove Languages 二、安装IBUS框架 sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 三、安装中文引擎 Ibus 拼音&#xff1…

console使用

console.log用于控制台打印&#xff1b;但除此之外console还有很多用处 1.分组打印console.group(分组打印1-2)console.log(1);console.log(2);console.groupEnd()console.group(分组打印3-4)console.log(3);console.log(4);console.group(俄罗斯套娃)console.log(5);console.…

Linux平台上搭建apache+tomcat负载均衡集群

传统的Java Web项目是通过tomcat来运行和发布的。但在实际的企业应用环境中&#xff0c;采用单一的tomcat来维持项目的运行是不现实的。tomcat 处理能力低&#xff0c;效率低&#xff0c;承受并发小&#xff08;1000左右&#xff09;。当用户请求较少时&#xff0c;单一的tomca…

(转)C#中 DirectoryEntry组件应用实例

C#中 DirectoryEntry组件应用实例DirectoryEntry类封装Active Directory层次结构中的节点或对象&#xff0c;使用该类可以绑定到对象&#xff0c;或者读取和更新属性。图1所示为DirectoryEntry组件。DirectoryEntry组件1&#xff0e; 功能DirectoryEntry类封装Active Director…

【Linux学习】epoll详解

From: http://blog.csdn.net/xiajun07061225/article/details/9250579 什么是epoll epoll是什么&#xff1f;按照man手册的说法&#xff1a;是为处理大批量句柄而作了改进的poll。当然&#xff0c;这不是2.6内核才有的&#xff0c;它是在2.5.44内核中被引进的(epoll(4) is a …

Windows Server Backup 2012设置备份周期

Windows Server Backup 2012设置备份周期 作者&#xff1a;杨坚 Windows Server Backup 概述 Windows Server Backup 功能提供一组向导及其他工具&#xff0c;您可用来对服务器执行基本的备份和恢复任务。自首次发布 Windows Server 2008 以来&#xff0c;此功能已得到更新。另…

JSP作业1--5!

输出5的阶乘 <body> <!-- 5的阶乘--> <% int s1; for(int j1;j<6;j){ %> <%s*j; %><% }%> <br> 5的阶乘是&#xff1a; <%s %> 结果&#xff1a; 转载于:https://www.cnblogs.com/miss123/p/5611038.html

Yii Zii.widgets.Cmenu 操作

为什么80%的码农都做不了架构师&#xff1f;>>> $this->widget(zii.widgets.CMenu, array( activeCssClass>当前热点元素的样式, firstItemCssClass>第一个元素的样式, lastItemCssClass>最后一个元素的样式, encodeLable>false //這樣&#xff…

比较分析 Spring AOP 和 AspectJ 之间的差别

比较分析 Spring AOP 和 AspectJ 之间的差别 英文原文&#xff1a;Comparative Analysis Between Spring AOP and AspectJ 标签&#xff1a; AspectJ Spring158人收藏此文章, 我要收藏oschina 推荐于 3年前 (共 7 段, 翻译完成于 10-24) (19评) 参与翻译(2人)&#xff1a; bear…

微信小程序打开pdf文件;uni-app下载打开pdf文件;uni-app微信小程序下载打开pdf文件预览;

1.首先需要在小程序后台-开发设置-服务器域名 配置好下载的域名。不配置&#xff1a;会导致下载失败和打开文件失败&#xff1b; 2.pdf文件的url要确保可以浏览器直接打开。 <template><view class"pdf"><view v-for"(item,index) in pdfList&q…

Dynamips结合VMware搭建站点到站点×××环境

Dynamips是现如今最好的思科模拟器&#xff0c;它能够加载的思科IOS&#xff0c;模拟出真实的路由器&#xff0c;这使得我们在没有思科设备的情况下也能很好的学习&#xff0c;Dynamips的强大之处不仅于此&#xff0c;它还能与我们的VMware虚拟机&#xff0c;甚至和真机实行互连…

httpd设置HTTPS双向认证

去年用tomcat、jboss配置过HTTPS双向认证&#xff0c;那时候主要用的是JDK自带的keytool工具。这次是用httpd openssl&#xff0c;区别比较大 在网上搜索了很多文章&#xff0c;发现全面介绍的不多&#xff0c;或者就是版本比较旧了。所以把我配置的过程完整地记录下来&#x…

微信小程序通讯录功能;uni-app微信小程序通讯录单选;uni-app微信小程序通讯录多选;uni-app微信小程序通讯录好友功能;uni-indexed-list使用;通讯录高度修改;

介绍&#xff1a;项目使用的是uni-app做的微信小程序&#xff1b;uni-app里原来就用一个组件uni-indexed-list&#xff0c;是用来做通讯录的&#xff1b;可以直接看官方案例也就是hello-uniapp-master下的导航栏&#xff1b;但是官方这个是多选&#xff0c;且没有默认选中功能&…