多个SQLite数据库实例在不同的线程(QT)上同时打开

时间:2015-07-20 12:10:36

标签: performance qt sqlite optimization thread-safety

从不同的线程同时使用多个开放连接有什么问题吗?

从我所看到的,默认情况下它的线程安全,但是,这是否会损害性能而不是改进它?

2 个答案:

答案 0 :(得分:1)

documentation说:

  

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

     

此外,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