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