在多个qt线程中使用单个QSqlDatabase连接

问题描述:

我有一个多线程Qt应用程序,它有多个线程访问单个数据库。我是否需要创建单独的QSqlDatabase连接来在每个线程中执行SELECT/INSERT/UPDATE?在多个qt线程中使用单个QSqlDatabase连接

从Qt文档,我无法理解,如果下面的指引是阻碍上述办法,我建议:

“的连接只能从创建它的线程中使用之间 移动连接不支持线程或创建来自 不同线程的查询。“

我实际上已经尝试在我的多个QThreads中使用相同的连接,并且所有工作都很好,但想要了解它是否正确。 https://www.sqlite.org/threadsafe.html

我想使用多个线程相同的连接名称的原因:

仅供参考,我(使用Qtsql API)据我所知使用的sqlite3从内部的Qt通过 默认支持串行模式是因为当我尝试在多个线程上使用不同的连接到同一个数据库并执行SELECT/INSERT/UPDATE时,我很频繁地得到了database locked问题。但是,在多个线程中使用相同的连接时,此问题已完全消除。

请亲切指导一下。

问候,

SAURABH甘地

+0

也许创建一个包装类,有一些插槽插入/更新/删除,并在它自己的线程 – Zaiborg

文档不仅仅是阻止它,它断然指出,你不能这样做(重点煤矿):

的连接只能是从创建它的线程内使用

因此,不,您不能使用多个线程中的一个连接。它可能会发生作用,但不能保证能够正常工作,而且你正在调用未定义的行为。不保证会崩溃,请注意。

您需要:

  1. 序列化在您结束访问数据库,或

  2. 更改连接参数,使锁不拒绝查询,但阻塞,直到该数据库变得可用。我不太确定database locked“问题”是什么:如果您实际使用多个连接,则永远不应该看到该错误代码(我认为它是SQLITE_LOCKED)。 Sqlite 3可以很容易地从多个线程中使用,除了启用多线程和使用单独的连接之外,它不需要任何努力。