• 168阅读
  • 12回复

[提问]数据库打开失败 [复制链接]

上一主题 下一主题
离线介农酥
 

只看楼主 倒序阅读 楼主  发表于: 09-08
4个线程同时打开同一个数据的不同连接时,有时候会失败,4个连接打开成功与否是随机的,我不太理解,难道由于同时打开,争夺资源什么的吗。

最后我没办法,将 if(!db.open())) 改成 while(!db.open),虽然是解决了问题,但是万一,一直打不开,那不死循环了吗(目前,我发现,打开两遍就行了)。
离线fsu0413

只看该作者 1楼 发表于: 09-09
死循环又不是不能避免,用个计数器break掉就完事了啊
离线cj123sn

只看该作者 2楼 发表于: 09-09
单例,全局使用1个数据库,读写锁加查询之间
离线介农酥

只看该作者 3楼 发表于: 09-09
回 fsu0413 的帖子
fsu0413:死循环又不是不能避免,用个计数器break掉就完事了啊 (2019-09-09 04:59) 

数据库没打开,跳出来,程序也用不了。
离线介农酥

只看该作者 4楼 发表于: 09-09
回 cj123sn 的帖子
cj123sn:单例,全局使用1个数据库,读写锁加查询之间 (2019-09-09 08:30) 

我用static总是导致程序运行一段时间后,中间崩溃,至今不知道原因。
离线XChinux

只看该作者 5楼 发表于: 09-09
数据库读写频繁吗?能否不管在哪个线程,用到时连接,读写,用完就释放。这样就不关心多线程问题。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线介农酥

只看该作者 6楼 发表于: 09-09
回 XChinux 的帖子
XChinux:数据库读写频繁吗?能否不管在哪个线程,用到时连接,读写,用完就释放。这样就不关心多线程问题。 (2019-09-09 10:40) 

很频繁,几万次,平均1s内读6、7次。要读还要写,第一次连接上了,后面就不用管了,当然,也可以逐个打开,我想这样也应该可以,我现在用while,也能用,因为,基本它循环两次就能打开了。
离线XChinux

只看该作者 7楼 发表于: 09-09
你这个频率太高了。应该换解决方案了。SQL数据库只作为永久存储。程序直接读、写应该用NoSQL了。积累到一定量或一定时间,再数据二次处理入永久SQL数据库。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线介农酥

只看该作者 8楼 发表于: 09-09
回 XChinux 的帖子
XChinux:你这个频率太高了。应该换解决方案了。SQL数据库只作为永久存储。程序直接读、写应该用NoSQL了。积累到一定量或一定时间,再数据二次处理入永久SQL数据库。 (2019-09-09 13:41) 

谢谢!获取数据是一定要及时获取,因为硬件需要根据获取数据执行动作,就是获取一次东西,然后执行一次,把结果写进去是可以的,这个NoSQL不是很懂,自己弄个缓冲,然后再写。不过,你这读,其实也可以,先把数据库中数据,先读出来存到NoSQL(一个hash就可以了吗),然后等真正需要的时候,再取的。

不过我现在程序真正要及时解决的是,从阿里云上获取数据,有的时候获取不到,我想,应该是网络的问题,因为将语句在DBMS执行的时候,也是很慢的,但是最终还是能获取到的,不知道,QT是不是设置了超时时间,程序最终无法获取的。
离线圣域天子

只看该作者 9楼 发表于: 09-09
是什么数据库?我用多线程管理的,200个连接没什么问题
离线介农酥

只看该作者 10楼 发表于: 09-10
回 圣域天子 的帖子
圣域天子:是什么数据库?我用多线程管理的,200个连接没什么问题 (2019-09-09 16:16) 

mysql,就是打开的时候有时候会失败,while打开两次一般就行了,是什么原因?
离线foxyz

只看该作者 11楼 发表于: 09-11
首先:线程之间不能共享一个数据库连接!!所以你在生成QSqlDatabase的时候需要根据线程ID来生成不同的数据库连接并分别打开。切记
离线圣域天子

只看该作者 12楼 发表于: 09-11
回 foxyz 的帖子
foxyz:首先:线程之间不能共享一个数据库连接!!所以你在生成QSqlDatabase的时候需要根据线程ID来生成不同的数据库连接并分别打开。切记 (2019-09-11 08:53) 

对~~~
快速回复
限100 字节
 
上一个 下一个