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,一经查实,立即删除!

相关文章

工业控制系统专业术语(不断完善中)

1、DCS (Distributed Control System)分布式控制系统。主要应用于石油、化工、电力等。2、SCADA (Supervisory Control And Data Acquisition)数据采集与监控,广泛用于电力系统、电气化铁道、风力发电。3、PLC( Programmable Logi…

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

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

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

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

基于MysqlConnector/C++的数据库连接池的实现

From: http://blog.csdn.net/educast/article/details/14164097 1.连接池的介绍: 1.1应用背景: 一般的应用程序都会访问到数据库,在程序访问数据库的时候,每一次数据访问请求都必须经过下面几个步骤:建立数据库连接&a…

【javascript】不刷新页面,实时显示当前时间

这里起主要作用的是setTimeout这个函数。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head>…

PCL Show Point Cloud 显示点云

在使用PCL库的时候&#xff0c;经常需要显示点云&#xff0c;可以用下面这段代码&#xff1a; #include <pcl/visualization/cloud_viewer.h>pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud; pcl::visualization::CloudViewer viewer ("Viewer"); viewer…

css字体自定义,bootstrap自定义字体

<style type"text/css">font-face{font-family:myFont;src:url(/bootstrap-3.3.7-dist/fonts/shishangjianti.ttf);}body{font-family: myFont !important;}</style> .ttf的文件路径根据文件位置定义

cmd连接mysql的方法详解

From: http://www.jb51.net/article/38059.htm 本篇文章是对cmd连接mysql的方法进行了详细的分析介绍&#xff0c;需要的朋友参考下连接&#xff1a;mysql -h主机地址 -u用户名 &#xff0d;p用户密码 &#xff08;注:u与root可以不用加空格&#xff0c;其它也一样&#xff09;…

c/c++多参数的问题

C/C语言有一个不同于其它语言的特性&#xff0c;即其支持可变参数&#xff0c;典型的函数如printf、scanf等可以接受数量不定的参数。如&#xff1a; printf ( "I love you" ); printf ( "%d", a ); printf ( "%d,%d", a, b );第一、二、三个pr…

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…

在linux上获得线程id的方法

From: http://www.linuxidc.com/Linux/2014-01/94723.htm 我使用了第二种方法&#xff0c;很方便&#xff1a; #define gettid() syscall(__NR_gettid) 用到的地方 gettid() 在linux2.4版本后&#xff0c;linux使用了NPTL作为自己的线程库&#xff0c;为了兼容POSIX标准&a…

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

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

html引入UI库vant

vant地址 注意html中不支持单标签元素 元素标签必须是闭合标签 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta nam…

nunjucks渲染富文本解析错误输出字符串而不是元素

今天遇到个坑&#xff0c;nunjucks 的插入变量{{}}输出的是字符串&#xff0c;而我用富文本编辑器插入数据库的是字符串&#xff0c;它不解析成元素(html),怎么办&#xff1f; 用什么方法引入它能成html&#xff1f; 网上查&#xff0c;没这个资料 因为以前用过EJS输出过字符…

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…

Linux获取线程id的方法学习

From: http://www.linuxidc.com/Linux/2014-01/94723.htm 最近一直在想&#xff1a; 如何确认两段代码是不是在同一个线程中执行的呢&#xff1f; 通过查看资料&#xff0c;发现一种比较简单的方法就是在代码中使用printf将当前线程的id打印出来。 而这也分成两种情况&#x…

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.…