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. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
  2. VC++文件编程操作实例
  3. 信息时代计算机应用技术,计算机应用技术
  4. 【报错】:Char 5: error: non-void f
  5. 在word 2010中采用EndNote X7插入引用
  6. 安装配置tengine
  7. Python | 不使用库函数将十进制数转换为二进制
  8. 将not exists更改为外连接
  9. type python django models_Django 模型
  10. 李飞飞之后谷歌再失华裔高管,谷歌AI中国中心总裁李佳离职创业
  11. ZigBee开发(1)--开发环境搭建
  12. mysql 唯一索引为null_mysql 中存在null跟空时创建唯一索引_mysql
  13. php 随机数据库,PHP实现随机一句功能
  14. AB PLC 1769_L24ER_QB1B新机测试固件下载-程序下载
  15. 200与mcgs485实例 smart_SMAART200与MCGS-工业支持中心-西门子中国
  16. [demo] 微信小程序Demo:树芽读书(一个不错的书籍朗读小程序)
  17. ELK:ElasticSearch定期关闭和删除索引脚本
  18. 【7】OPencv骨架细化算法
  19. php 替换表情符号,php怎么实现正则替换特殊符号
  20. Sublime Text3轻量型跨平台C/C++开发环境(上) 安装使用篇

热门文章

  1. 自已脚本开发常用的底层方法
  2. Source Code Library 源代码收集器
  3. Vista系统自带IIS 7.0设置技巧详解
  4. 汉诺塔递归算法进阶_进阶python 1递归
  5. spring框架里面applicationContext.xml 和spring-servlet.xml 的区别
  6. leetcode 1473. 粉刷房子 III(dp)
  7. 如何使用JavaScript检查输入是否为空
  8. 二. linux基础命令
  9. 使用web3j构建以太坊钱包
  10. 【Alpha 冲刺】 2/12