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. 若线程的删除和建立比较频繁,需要在获取连接时使用连接池。

mysql Connector C/C++ 多线程封装相关推荐

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

    bitsCN.com mysql Connector C/C++ 多线程封装 在网上找了好久,有很多封装,但是感觉对多线程处理的不多,都不是很理想.封装完的第一个版本,想法比较简单,使用一个单例模式, ...

  2. python3 操作mysql数据库(mysql.connector 和 pymysql )

    1. PyMySQL 的使用 (1) 什么是 PyMySQL?   PyMySQL 是 Python 中用于连接 MySQL 服务器的一个库,它遵循 Python 数据库 API 规范 V2.0,并包 ...

  3. 【原创】MySQL Connector/C 库的版本选择

          公司内部封装的的 dbi 库依赖于 mysql connector/c 库,但由于历史原因,其所依赖的  mysql connector/c 库的版本为原始的 v6.0.2 , 为了对此现 ...

  4. MySQL Connector/C++入门教程(上)

    转载原文:http://blog.csdn.net/jgood/article/details/5661339 原文地址: http://dev.mysql.com/tech-resources/ar ...

  5. mysql connector开源协议_Spring Boot 集成 MariaDB Connector/J 连接 MySQL

    本文介绍 Spring Boot 2 集成 MariaDB Connector/J 驱动连接 MySQL 数据库的方法. 目录 MariaDB Connector/J 简介 版本说明 代码示例 Mar ...

  6. mysql connector cpp_MySQL Connector/C++(一)

    如果我翻译错了或者翻译的不好,欢迎指正- Developing Database Applications Using MySQL Connector/C++ 这个教程会教你搭建安装MySQL Con ...

  7. mysql connector c++与 visual studio 2012 联合使用

    软件环境: win8 build8200 64位版本, visual studio 2012, mysql 5.5.28, mysql connector c++ 1.1.1 从官网上下载了mysql ...

  8. mysql connector python linux_MySQL Connector/Python 安装、测试

    安装Connector/Python: # wget http://cdn.mysql.com/Downloads/Connector-Python/mysql-connector-python-1. ...

  9. MySQL Connector/C++ 接口实例

    mysql的官方网站有对MySQL Connector/C++的文档解释和具体实例,但是大家也知道,如果把那些具体实例的代码只是生硬的套入项目工程中是万万不行的,因为项目安全性要求,需要对容错,资源创 ...

最新文章

  1. 超级直播tv港澳台版2020_直播链接 2020年泉州足球超级联赛 第一轮
  2. 西安python工资怎么样-西安Python和人工智能的薪资前景到底怎么样?
  3. 面试题之在字符串中查找出第一个只出现一次的字符的位置
  4. Linux命令行管道
  5. 作业三--简单四则运算
  6. win linux 远程桌面连接,Windows 连接 Ubuntu 16.04 远程桌面
  7. phpfind mysql怎么用_MySQL 的 find_in_set 函数使用方法
  8. 项目部署到weblogic后页面乱码问题
  9. 2019腾讯广告算法大赛方案分享(冠军)
  10. 03-postgresql报错ERROR: operator does not exist: numeric = character varyin
  11. SAP License:最近的FICO面试题目
  12. iOS项目开发实战——使用Xcode6设计自己定义控件与图形
  13. 最快理解使用CSS弹性盒子
  14. Aho-Corasick
  15. python画中国的轮廓_利用python绘制中国地图(含省界、河流等)
  16. 记录五年前的天马行空的想象
  17. 时间序列预测系列文章总结(代码使用方法)
  18. Visual Studio Community2015及使用
  19. G3D游戏引擎——编译
  20. 自动分析黑名单及白名单的iptables脚本

热门文章

  1. 6月份美国域名总量新增近5.4万个 环比减少51%
  2. python中格式化字符串_Python中所有字符串格式化的指南
  3. leetcode 877. 石子游戏(dp)
  4. leetcode 1442. 形成两个异或相等数组的三元组数目(位运算)
  5. spring—Bean实例化三种方式
  6. leetcode 767. 重构字符串(贪心算法)
  7. 心学 禅宗_禅宗宣言,用于有效的代码审查
  8. python 数据框缺失值_Python:处理数据框中的缺失值
  9. 20175305张天钰 《java程序设计》第四周课下测试总结
  10. gulp基础使用方法记录