从不同的线程同时使用多个开放连接有什么问题吗?
从我所看到的,默认情况下它的线程安全,但是,这是否会损害性能而不是改进它?
答案 0 :(得分:1)
只能在创建连接的线程中使用连接。 在线程之间移动连接或从中创建查询 不支持不同的线程。
此外,QSqlDrivers使用的第三方库也可以 在多线程中使用SQL模块的进一步限制 程序。有关更多信息,请参阅数据库客户端手册 信息。
这意味着您必须创建与父线程链接的数据库连接。在docs的QSqlDatabase类中,您可以看到描述:
QSqlDatabase类表示与数据库的连接。
QSqlDatabase类提供用于访问数据库的接口 通过连接。 QSqlDatabase的一个实例代表 连接。该连接通过以下方式之一提供对数据库的访问 受支持的数据库驱动程序,它们派生自QSqlDriver。
通过调用一个连接(即QSqlDatabase的实例) 静态addDatabase()函数,您可以在其中指定驱动程序或 要使用的驱动程序类型(即,您将访问哪种数据库?) 和连接名称。
使用静态addDatabase()
功能是创建连接的方法。
但由于Renzo said SQLite不同时支持多个写入事务。所以你需要一些机制(包装器)来使用低级互斥体或类似的东西来同步线程,比如任务队列。您可以在docs找到更多信息。
答案 1 :(得分:0)
拥有多个连接不是问题,唯一要记住的是SQLite不支持多个写事务的并发。来自SQlite site:
SQLite支持无限数量的同时阅读器,但它只允许一个编写者在任何时刻。在许多情况下,这不是问题。作家排队。每个应用程序都可以快速完成数据库的工作并继续运行,并且锁定持续时间超过几十毫秒。但是有些应用程序需要更多的并发性,而这些应用程序可能需要寻求不同的解决方案。
SQLite是一个“非典型”的数据库管理系统:实际上它是一个库,它提供SQL作为语言来访问简单的“数据库中的文件”,以及DBMS的一些其他功能。例如,它没有真正的并发控制(它使用操作系统函数来锁定db文件)。
因此,如果您需要并发插入数据库,则应使用其他内容,例如PostgreSQL。