qt中的数据库可以创建在主函数中吗_qt数据库多线程问题的解决(QSqlDatabase只能在创建它的线程中使用)...

Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的

几乎国内没有文章提到这个问题,这几天在做数据库压力测试时遇到了

假设有如下代码:

bool openDatabase()

{

QSqlDatabase db;

QString connectionName = "sqlite";

db = QSqlDatabase::addDatabase("QSQLITE", connectionName);

db.setDatabaseName("/jyxtec.db");

if (db.open())

return true;

else

return false;

}

void testQuery()

{

QSqlQuery query(QSqlDatabase::database("sqlite"));

query.exec("SELECT * from t_test");

// ..........

}

这里的testQuery()是不支持多线程调用的,只能在调用OpenDatabase()的线程中使用.否则很容易段错误。

解决方法有两种:

1)每个调用testQuery的线程中创建不同connectionName的QSqlDatabase

比如线程A

QSqlDatabase::addDatabase("QSQLITE", "A");

QSqlQuery query(QSqlDatabase::database("A"));

线程B

QSqlDatabase::addDatabase("QSQLITE", "B");

QSqlQuery query(QSqlDatabase::database("B"));

2)实现一个数据库线程池,创建N个不同connectionName的QSqlDatabase,所有的query命令都放到这个线程池中处理。

作者:帅得不敢出门  程序员群:31843264

http://blog.chinaunix.net/uid-20680966-id-4779621.html

Java 多线程详解(二)------如何创建进程和线程

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html 在上一篇博客中,我们已经介绍了并发和并行的区别,以及进程和 ...

Qt数据库编程_基本

QtSql模块提供了一个平台无关且数据库无关的访问SQL数据库的接口. Qt中的每个数据库连接用一个QSqlDatabase对象来表示:Qt使用不同driver来和各种不同数据库的API进行通讯. Q ...

sqlite:多线程操作数据库“database is locked”解决方法(二)

上一篇博客通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...

Qt+数据库

前言支持内置数据库: 一.sqlite 1.在头文件中声明数据库对象 QSqlDatabase db; 2.在构造函数中定义对象(最好这样定义,因为对于db来说只需要addDatabase一次,否则多 ...

Qt数据库之数据库连接池

 前面的章节里,我们使用了下面的函数创建和取得数据库连接: void createConnectionByName(const QString &connectionName) { QSql ...

【转】Qt数据库总结

转自:http://blog.chinaunix.net/uid-25201977-id-3014100.html #include QT += sql QSqlDataba ...

Qt数据库(sqlite) — 总结

#include QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类 封装数据库所有记录 第一: ...

Qt添加驱动——Qt数据库之添加MySQL驱动插件

Qt数据库之添加MySQL驱动插件(1) 现在可用的数据库驱动只有3种,在Qt中,我们需要自己编译其他数据库驱动的代码,让它们以插件的形式来使用.下面我们就以现在比较流行的MySQL数据库为例,说明一 ...

Qt——数据库编程

一.概述 Qt提供了一个类似JDBC的数据库接口,需要为每个可以连接的特定数据库提供驱动程序,可以通过 QStringList QSqlDatabase::drivers() 知道当前版本的Qt哪些驱 ...

随机推荐

什么是JAVAbean

JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性 ...

Fastlane为iOS带来持续部署

Fastlane是一组工具套件,旨在实现iOS应用发布流程的自动化,并且提供一个运行良好的持续部署流程,只需要运行一个简单的命令就可以触发这个流程. Fastlane是一个ruby脚本集合,其中囊括了 ...

1.一起来学hibernate之hibernate简介

一.简介 Hibernate,是一个开源的ORM框架.所谓的ORM,即object relative mapping,就是对象关系映射. 那什么是对象关系映射? 对象,即java类,又称为实体类,对象 ...

TCP具体解释(2):三次握手与四次挥手

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接,就好像你给别人打电话.必须等线路接通了.对方拿 ...

【Lucene3.6.2入门系列】第03节_简述Lucene中常见的搜索功能

package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.text.SimpleD ...

@Valid springMVC bean校验不起作用及如何统一处理校验

SpringMVC 使用JSR-303进行校验 @Valid 使用注解 一.准备校验时使用的JAR validation-api-1.0.0.GA.jar:JDK的接口: hibernate-vali ...

爱加密亮相第十八届软博会,移动App安全引关注

2014年5月29日至31日,2014年第十八届中国国际软件博览会在北京展览馆举行,此次软博会的主题为"软件引领信息消费,助力经济转型升级",充分展示软件业在促进信息消费.提升社会 ...

asp.net模板控件示例

原文:asp.net模板控件示例 模板控件允许将控件数据与其表示形式相分离,模板化控件不提供用户界面. 编写它则是为了实现一个命名容器以及包含属性和方法可由宿主页访问的类,MSDN是这样解释的. 下面 ...

python爬虫框架scrapy问题的解决

2016-09-24:今天的弄了一天的scrapy的环境的配置的,linux很多的学过的事情都忘记啦.理论和实践的结合还是非常的重要的,不光要学会思考,更要学会总结纪录.还要多多回忆的和复习.学习了不 ...

你可能感兴趣的:(qt中的数据库可以创建在主函数中吗_qt数据库多线程问题的解决(QSqlDatabase只能在创建它的线程中使用)...)