我是Qt开发的新手,它处理线程(信号和插槽)和数据库(以及SQLite)的方式。我已经开始研究上述技术已有4周了。这是我第一次在SO上发帖提问,我觉得在你找到所有人之前我已经做过研究。这可能看起来有点长,可能是重复的,但是我要求你们一次彻底阅读它,然后将它作为副本或tl解决;博士。
上下文:
我正在开发一个在数据库上执行特定操作X的Windows应用程序。该应用程序是在Qt中开发的,并使用QSQLite作为数据库引擎。它是单线程应用程序,即表格是按顺序处理的。但是,随着DB大小的增加(表和记录的数量),此处理变得更慢。此操作X的结果写在同一DB中的单独结果表中。正在进行的处理对于这个问题并不重要,但从基本的角度来看,它的作用是什么:
从Table_X_1中读取一行
从Table_X_2中读取一行
对行进行一些操作(仅读取)
将结果推送到Table_X_Results表中(这是在DB上执行的唯一写操作)
Table_X_1和Table_X_2的列数和行数以及行数相同,只是数据可能不同。
我想做的事:
为了提高性能,我试图让应用程序多线程化。最初我正在产生两个线程(使用QtConcurrentRun)。这两个表可以分为两种类型,比如A和B.每个线程将处理两种类型的表。线程内的处理保持相同,即,在每个线程内,表顺序处理。
该函数使用SELECT来获取要处理的行,并使用INSERT将结果插入到结果表中。为了插入结果,我正在使用交易。
在开始实际操作之前,我正在创建所有中间表,结果表和索引。我每次都打开和关闭连接。对于线程,我在进入循环之前创建并打开一个连接(每个线程一个)。
问题:
在我的处理功能中,我得到了以下(讨厌的,臭名昭着的,顽固的)错误:
QSqlError(5,"无法获取行","数据库被锁定")
当我尝试从DB读取一行时(使用SELECT),我收到此错误。这与我在结果表中执行INSERT的功能相同。 SELECT和INSERT位于同一事务中(开始和提交对)。对于INSERT我使用预准备语句(SQLiteStatement)。
我正在做的看似奇怪的事情的原因:
观察:
当我关闭我的连接时,我收到此警告:
QSqlDatabasePrivate :: removeDatabase:connection' DB_CONN_CREATE_RESULTS'仍在使用中,所有查询都将停止工作。
这有什么意义吗?某些链接表明由于使用本地QSqlDatabase而出现此警告,并且如果连接成为类成员,则不会出现此警告。但是,这可能是我遇到问题的原因吗?
进一步的实验:
我试图发布我已经探索过的网络资源,但是我收到一条消息说“#34;我需要10个代表来发布2个以上的链接"。任何帮助/建议将不胜感激。