同时使用多个不同线程的开放式连接有问题吗?
从我所了解的来看,默认情况下是线程安全的,但这样做是否会影响性能而非提高它?
同时使用多个不同线程的开放式连接有问题吗?
从我所了解的来看,默认情况下是线程安全的,但这样做是否会影响性能而非提高它?
SQLite是一种“非典型”的数据库管理系统:实际上它是一个库,提供了SQL作为访问简单的“文件式数据库”的语言和其他几个DBMS的功能。例如,它没有真正的并发控制(它使用操作系统函数来锁定db文件)。SQLite支持无限数量的同时读取者,但它只允许在任何时刻只有一个写入者。对于许多情况来说,这不是问题。写入者排队。每个应用程序快速地完成其数据库工作并继续进行,没有锁定持续时间超过几十毫秒。但是有些应用程序需要更多的并发性,这些应用程序可能需要寻找另一种解决方案。
文档中写到:
一个连接只能在创建它的线程中使用。在不同的线程之间移动连接或创建查询不受支持。
此外,QSqlDrivers 使用的第三方库可能会对在多线程程序中使用 SQL 模块施加进一步限制。请参阅您的数据库客户端手册以获取更多信息。
这意味着您必须创建连接到与父线程链接的数据库。在 QSqlDatabase 类的文档中,您可以看到其描述:
QSqlDatabase类表示与数据库的连接。
QSqlDatabase类提供通过连接访问数据库的接口。QSqlDatabase的一个实例表示连接。连接通过其中一个受QSqlDriver派生的支持的数据库驱动程序之一提供对数据库的访问。
调用其中一个静态的addDatabase()函数来创建连接(即QSqlDatabase的一个实例),在该函数中你需要指定要使用的驱动程序或驱动程序类型(即将访问哪种类型的数据库)以及一个连接名称。
使用静态的addDatabase()
函数是创建连接的方法。
但正如Renzo所说,SQLite不支持同时进行多个写事务。因此,你需要一些机制(包装器)来同步线程,例如使用低级别的互斥锁或类似的任务队列等。更多信息请参见文档。