• 8026阅读
  • 20回复

[提问]Qt多线程访问数据库的错误 [复制链接]

上一主题 下一主题
在线uidab
 

只看楼主 倒序阅读 楼主  发表于: 2016-01-25

错误提示
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
Segmentation fault
几经查找发现是多线程访问MYSQL问题,不知道有遇到的这个问题的人吗?
主要是数据有多(三)个,每个有多个表。因为需要是从不同线程访问。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线link8001

只看该作者 1楼 发表于: 2016-01-25
    if(QSqlDatabase::contains("qt_sql_default_connection"))
    {
        db = QSqlDatabase::database("qt_sql_default_connection");
    }
    else
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
    }
QSQLITE驱动改成MYSQL即可
在线uidab

只看该作者 2楼 发表于: 2016-01-25
回 link8001 的帖子
link8001:    if(QSqlDatabase::contains("qt_sql_default_connection"))
    {
        db = QSqlDatabase::database("qt_sql_default_connection");
    }
&n .. (2016-01-25 11:20) 

不行啊。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
在线uidab

只看该作者 3楼 发表于: 2016-01-25
QMYSQLResult::cleanup: unable to free statement handle
Segmentation fault
有时候是这个错误,然后程序崩掉
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线XChinux

只看该作者 4楼 发表于: 2016-01-25
不可跨线程使用田一个QSqlDatabase对象连接。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
在线uidab

只看该作者 5楼 发表于: 2016-01-26
回 XChinux 的帖子
XChinux:不可跨线程使用田一个QSqlDatabase对象连接。 (2016-01-25 20:56) 

嗯,错误原因就是这个,正在改,主要是项目用了很多次调用。一切参数都写到数据库里了。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线bingyifeng

只看该作者 6楼 发表于: 2016-01-27
回 XChinux 的帖子
XChinux:不可跨线程使用田一个QSqlDatabase对象连接。 (2016-01-25 20:56) 

请教版主一个问题啊,
可以在一个线程中初始化QSqlDatabase(这个线程只负责初始化)
另外一个线程中使用吗(仅此一个线程访问)吗?

我们目前就是这样用的,暂时没发现问题,但是“不可跨线程使用田一个QSqlDatabase对象连接。”
这句话,让我一直产生疑惑。
<span style="color:blue ">淘宝,绿石斋</span> <a href="http://shop33295817.taobao.com“> <span style="color:blue ">各种水晶饰品,手链,项链 </span></a>
在线uidab

只看该作者 7楼 发表于: 2016-01-27
回 bingyifeng 的帖子
bingyifeng:请教版主一个问题啊,
可以在一个线程中初始化QSqlDatabase(这个线程只负责初始化)
另外一个线程中使用吗(仅此一个线程访问)吗?
....... (2016-01-27 16:54) 

确实是不可跨线程使用一个QSqlDatabase对象连接。但也不是一下子就崩溃。

你这样使用应该再测试一下。看看两个线程在调用SqlDatabase对象的线程地址。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线stlcours

只看该作者 8楼 发表于: 2016-01-27
m_database = QSqlDatabase::addDatabase("QSQLITE", "这里!根据时间起一个随机的名字!");

这样后一个才能不删掉前一个。我这里是sqlite,没有任何问题。mysql应该更没有问题。
在线uidab

只看该作者 9楼 发表于: 2016-01-28
回 stlcours 的帖子
stlcours:m_database = QSqlDatabase::addDatabase("QSQLITE", "这里!根据时间起一个随机的名字!");
这样后一个才能不删掉前一个。我这里是sqlite,没有任何问题。mysql应该更没有问题。 (2016-01-27 23:43) 

这是个有意思的解决方法,我这里只有几百M内存,sqlite是没问题,因为它和mysql设计初衷不一样。但是项目设计要求用mysql。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线stlcours

只看该作者 10楼 发表于: 2016-01-28
回 uidab 的帖子
uidab:这是个有意思的解决方法,我这里只有几百M内存,sqlite是没问题,因为它和mysql设计初衷不一样。但是项目设计要求用mysql。 (2016-01-28 17:05) 

这不是什么有意思的方法,我也是从失败中得来的教训。以前不自己起名,每次都是后面的会把前面的覆盖,后来根据时间起名就没有问题了。另外,数据库内存对象和数据集内存是两回事,就算你只有几百兆内存,开个几十个数据库内存对象还是没有问题的,关键是数据集内存使用完以后要立刻释放。

刚注意到,你是版主。。。
在线uidab

只看该作者 11楼 发表于: 2016-01-28
回 stlcours 的帖子
stlcours:这不是什么有意思的方法,我也是从失败中得来的教训。以前不自己起名,每次都是后面的会把前面的覆盖,后来根据时间起名就没有问题了。另外,数据库内存对象和数据集内存是两回事,就算你只有几百兆内存,开个几十个数据库内存对象还是没有问题的,关键是数据集内存使用完以后要 .. (2016-01-28 17:14)

我一直用的是sqlite,很少用mysql,这次遇到mysql这个错误也是第一次。而且启动mysql的服务大概2、300M的。所以性能基本上已经到了极限。另外原有设计者就没设计关闭的过程,我也是在改进它。

有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线stlcours

只看该作者 12楼 发表于: 2016-01-28
回 uidab 的帖子
uidab:我一直用的是sqlite,很少用mysql,这次遇到mysql这个错误也是第一次。而且启动mysql的服务大概2、300M的。所以性能基本上已经到了极限。另外原有设计者就没设计关闭的过程,我也是在改进它。
 (2016-01-28 18:13) 

我以前一直用Mysql(但不是和QT搭配),它性能强劲,就连BAT很多服务都使用mysql,而不是昂贵的其它货品。另外mysql启动就2、300M,说明你的mysql.ini配置没配好。官方就提供三个配置模板,自己搞清楚参数后,更是可以随心所欲配置一下,这样就可以完全避免你说的问题了。
在线uidab

只看该作者 13楼 发表于: 2016-01-29
回 stlcours 的帖子
stlcours:我以前一直用Mysql(但不是和QT搭配),它性能强劲,就连BAT很多服务都使用mysql,而不是昂贵的其它货品。另外mysql启动就2、300M,说明你的mysql.ini配置没配好。官方就提供三个配置模板,自己搞清楚参数后,更是可以随心所欲配置一下,这样就可以完全避免你说的问题了。 (2016-01-28 20:43) 

       你说的可能是大型服务器,我们这里是嵌入式,本身性能级别就低,甚至都不如手机的arm芯片。没法比的。手机程序我知道的都是sqlite。
不过还是谢谢你的建议。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线ysu533

只看该作者 14楼 发表于: 2016-02-16
回 stlcours 的帖子
stlcours:我以前一直用Mysql(但不是和QT搭配),它性能强劲,就连BAT很多服务都使用mysql,而不是昂贵的其它货品。另外mysql启动就2、300M,说明你的mysql.ini配置没配好。官方就提供三个配置模板,自己搞清楚参数后,更是可以随心所欲配置一下,这样就可以完全避免你说的问题了。 (2016-01-28 20:43) 

MySql是个好东西, 但是不喜欢 "BAT 很多服务都使用过" 的论调, 记得有篇文章评测过, 在很多情况下这类数据库在仅仅通过配置是不能达到需求的. 这篇文章的结论, 人家是用, 但是人家的用法你是学不到的, 人家可能有一个开发团队在对这个东西再度开发, 已经不是单纯的 Mysql了, 称 B-Mysql, A-Mysql, T-Mysql 可能更合适些.

就比如都说在服务器领域 Linux 比 Windows 安全, 我觉得更多的因素是前者开源, 有实力的公司可以再度开发或修补. 但是对一个新手菜鸟, 我看这个结论就未必.
离线XChinux

只看该作者 15楼 发表于: 2016-02-16
我一般使用非默认数据库连接时,使用完就断开链接释放掉(QSqlDatabase::removeDatabase()),下次再使用时再连接。当然如果你使用频率比较高,那可保持连接。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线stlcours

只看该作者 16楼 发表于: 2016-02-17
回 ysu533 的帖子
ysu533:MySql是个好东西, 但是不喜欢 "BAT 很多服务都使用过" 的论调, 记得有篇文章评测过, 在很多情况下这类数据库在仅仅通过配置是不能达到需求的. 这篇文章的结论, 人家是用, 但是人家的用法你是学不到的, 人家可能有一个开发团队在对这个东西再度开发, 已经不是单纯的 Mys .. (2016-02-16 11:55) 

B-Mysql, A-Mysql, T-Mysql 可能更合适些。

是可以改的更好用、更适合,但也不可能有质变呀,特别是速度。
离线ysu533

只看该作者 17楼 发表于: 2016-02-17
回 stlcours 的帖子
stlcours:B-Mysql, A-Mysql, T-Mysql 可能更合适些。
是可以改的更好用、更适合,但也不可能有质变呀,特别是速度。 (2016-02-17 17:10) 

没有质变? 养那些开发团队干什么啊, 招几个运维不就得了.  我们用的是一般用途的通用版的, 人家是针对特定应用场合优化, 甚至是另外再开发的, 算法什么都不一样. 你说速度没有质变. 你要是运营过流量高些的网站你就知道了, pv 一个, 常规的mysql各种问题就出来了. 何况这些巨头的访问量.
离线stlcours

只看该作者 18楼 发表于: 2016-02-17
回 ysu533 的帖子
ysu533:没有质变? 养那些开发团队干什么啊, 招几个运维不就得了.  我们用的是一般用途的通用版的, 人家是针对特定应用场合优化, 甚至是另外再开发的, 算法什么都不一样. 你说速度没有质变. 你要是运营过流量高些的网站你就知道了, pv 一个, 常规的mysql各种问题就出来了. 何况 .. (2016-02-17 17:27) 

理论上你说的有理。虽然没见识过BAT里面的高手是如何工作的,但是我不信有多少人能伤筋动骨的修改Mysql的源码,更别说会有脱胎换骨的结果——如果这些人做得到,那么mysql的原作者工程师们做不到吗?BAT究竟有何特别需求需要特别的优化呢?而且这种优化居然还是原作者的工程师们所没有想到的。
离线ysu533

只看该作者 19楼 发表于: 2016-02-18
回 stlcours 的帖子
stlcours:理论上你说的有理。虽然没见识过BAT里面的高手是如何工作的,但是我不信有多少人能伤筋动骨的修改Mysql的源码,更别说会有脱胎换骨的结果——如果这些人做得到,那么mysql的原作者工程师们做不到吗?BAT究竟有何特别需求需要特别的优化呢?而且这种优化居然还是原作者的工程师们 .. (2016-02-17 22:55) 

计算机本来就是一门折中的艺术, 计算机大部分的解决方案是通用, 而不是针对某个特定解决方案的最优解. 这在大多数是没有问题的. 但对一些大规模的处理某一特定问题, 可能根本就不行. 软件如此, 硬件也如此.

比如早期的计算机, 内存都是 sram, 而现在是d(d)ram, 后者能替换前者的原因不是后者性能更好, 相反前者性能比后者要好很多, 而且更易于管理.  但是同样的容量造价要更很多很多.  但是sram也没淘汰, 而是被应用于特定领域.
离线z609932088

只看该作者 20楼 发表于: 2016-02-18
database::database()//注意多数据库的打开方式
{
    //在多数据库文件的时候需要这样写,不然会有数据问题
    if(QSqlDatabase::contains("qt_sql_default_connection"))
        db = QSqlDatabase::database("qt_sql_default_connection");
    else
        db=QSqlDatabase::addDatabase("QSQLITE");

}
有阳光的地方就是青春
快速回复
限100 字节
 
上一个 下一个