关于文化建设网站,网站建设都会用到哪些建站工具,wordpress自建会员,厦门制作公司网站哪家好From: http://blog.csdn.net/educast/article/details/14163519 在网上找了好久#xff0c;有很多封装#xff0c;但是感觉对多线程处理的不多#xff0c;都不是很理想。封装完的第一个版本#xff0c;想法比较简单#xff0c;使用一个单例模式#xff0c;对应一个连接有很多封装但是感觉对多线程处理的不多都不是很理想。封装完的第一个版本想法比较简单使用一个单例模式对应一个连接多线程查询的时候都是在这个链接上完成如下简略代码 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. 若线程的删除和建立比较频繁需要在获取连接时使用连接池。