从多个线程写入SQLite数据库

时间:2015-08-04 07:30:32

标签: c++ multithreading qt sqlite

我正在编写一个监控某些统计信息的QT应用程序。在主窗口中,您可以选择多个(或仅一个)项目并为它们打开图形窗口。每个项目都从不同的线程进行轮询。

每次我获取数据时,它都是在SQLite数据库中编写的,但我遇到了一个问题:

我在具有SSD驱动器的计算机上制作此应用程序并且运行正常,但是当我在具有HDD的计算机上运行它时,应用程序崩溃(崩溃发生在QT sqlite dll文件 - qsqlite.dll中)。我搜索了这个问题,发现很多人都说sqlite不推荐用于此类用途。我在写入数据库时​​也使用QMutex来锁定/解锁部分,但不幸的是它无法解决问题。

有没有办法可以使用sqlite,或者我是否必须寻找不同的数据库,例如postgres?

感谢您的时间!

1 个答案:

答案 0 :(得分:1)

我从未在一个应用程序中成为多个数据库连接的粉丝。

在您的情况下,我会为所有write-SQL语句实现一个队列(FIFO),并通过一个连接将它们发送到数据库。由于您将从多个线程写入队列,因此您必须使用互斥锁等来保护对队列的写入。

这样,代码中唯一的线程争用就是SQLite驱动程序不必太努力。

我还会考虑从读取查询缓存数据,因此您只需要请求您尚未拥有的数据。也就是说,请求最近的100个值并将它们保存在数组或列表中,然后当您下次请求值时,只请求数组中最后一个值的值。