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

Performance 在不同线程上同时打开多个SQLite数据库实例(QT),performance,qt,sqlite,optimization,thread-safety,Performance,Qt,Sqlite,Optimization,Thread Safety,同时从不同线程使用多个打开的连接是否有问题 据我所知,默认情况下它是线程安全的,但是,这会影响性能而不是提高性能吗?拥有多个连接不是问题,唯一需要记住的是SQLite不支持多个写事务的并发。从SQlite: SQLite支持无限数量的同时读卡器,但它在任何时刻都只允许一个编写器。在许多情况下,这不是问题。作家排队。每个应用程序都能快速地完成数据库工作并继续运行,并且锁定时间不会超过几十毫秒。但是有些应用程序需要更多的并发性,这些应用程序可能需要寻求不同的解决方案 SQLite是一个“非典型”数据

同时从不同线程使用多个打开的连接是否有问题


据我所知,默认情况下它是线程安全的,但是,这会影响性能而不是提高性能吗?

拥有多个连接不是问题,唯一需要记住的是SQLite不支持多个写事务的并发。从SQlite:

SQLite支持无限数量的同时读卡器,但它在任何时刻都只允许一个编写器。在许多情况下,这不是问题。作家排队。每个应用程序都能快速地完成数据库工作并继续运行,并且锁定时间不会超过几十毫秒。但是有些应用程序需要更多的并发性,这些应用程序可能需要寻求不同的解决方案

SQLite是一个“非典型”数据库管理系统:实际上,它是一个库,提供SQL作为访问简单的“文件中的数据库”和DBMS的一些其他功能的语言。例如,它没有真正的并发控制(它使用操作系统函数锁定db文件)

因此,如果您需要并发插入数据库,您应该使用其他方法,例如。

例如:

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

此外,QSqlDrivers使用的第三方库可以 对在多线程系统中使用SQL模块施加进一步的限制 节目。有关更多信息,请参阅数据库客户端手册 信息

这意味着您必须创建到数据库的连接,该数据库将与父线程链接。在QSQLDABASE类的下面,您可以看到描述:

QSqlDatabase类表示到数据库的连接

QSqlDatabase类提供用于访问数据库的接口 通过连接。QSqlDatabase的一个实例表示 连接。该连接通过以下方式之一提供对数据库的访问: 受支持的数据库驱动程序,它们派生自QSqlDriver

通过调用一个连接创建一个连接(即QSqlDatabase的实例) 指定驱动程序或 要使用的驱动程序类型(即,您将访问哪种类型的数据库?) 和一个连接名

使用静态函数是创建连接的一种方法


但由于Renzo SQLite不支持同时执行多个写事务。所以,您需要一些机制(包装器)来同步线程,比如使用低级互斥体或类似的东西来同步任务队列。有关更多信息,请访问。

这是否意味着我不能在不同的线程上进行插入/更新?是的,您不能同时进行修改。请参阅我的更新答案。@Renzo,这是错误的:您可以在不同的线程上写入数据库,但不能同时写入。一种方法是使用互斥锁并将共享数据从不同的线程发布到数据库。@t3ft3l--i,怎么了?SQLite手册?或者并发是在操作系统级别完成的?我说的是DBMS级别的并发性。SQLite的并发性在DBMS级别不是真正的并发性。这很简单。在“真正的”DBMS中,您可以每秒有数千个写入事务,在SQLite中,不可以。您可以在线程中使用insert等。只有您应该知道,即使线程对不同的数据进行操作,它们也会被序列化。但是,它们由系统自动序列化,因此您不必更改程序。此外,您只有几个线程这一事实意味着您不会注意到应用程序的任何特定性能损失。正如我在对我的答案的评论中所写的,实际上没有必要显式同步线程。序列化是由SQLite自动完成的。@Renzo,因此需要配置SQLite