从多个线程向sqlite写入数据的最佳方法

时间:2016-09-30 06:39:58

标签: c++ multithreading sqlite

我正在创建一个监控应用程序。我想从所有服务器读取查询并将其存储在sqlite文件中。在需要时显示它。我使用c ++编写这个应用程序 - 从多个服务器获取和存储数据到一个sqlite数据库。我使用单独的线程从多个服务器获取数据。如果我直接获取并向sqlite写入数据,那么它可能会锁定sqlite文件,因为100个线程将同时写入。 从多个线程向sqlite写入数据的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您无法控制同时写入操作的数量,我认为使用sqlite有更好的方法。

SQLite不是为您的用例而设计的。考虑切换到客户端/服务器RDBMS。这也是SQLite建议的:

https://www.sqlite.org/whentouse.html

  

客户端/服务器RDBMS可以更好地工作的情况

     

客户端/服务器应用程序

     

如果有许多客户端程序通过网络将SQL发送到同一数据库,则使用客户端/服务器数据库引擎而不是   SQLite的。 SQLite将在网络文件系统上工作,但由于   与大多数网络文件系统相关的延迟,性能不会   太棒了此外,文件锁定逻辑在许多网络文件系统中都是错误的   实现(在Unix和Windows上)。如果文件锁定没有   如果工作正常,两个或多个客户端可能会尝试修改同一部分   同一个数据库同时导致腐败。   因为此问题是由底层文件系统中的错误引起的   实现时,SQLite无法阻止它。

     

一个好的经验法则是避免在直接访问相同数据库的情况下使用SQLite(无需干预)   应用程序服务器)同时来自多台计算机   网络

     

(...)

     

高并发

     

SQLite支持无限数量的同时阅读器,但它只允许一个编写者在任何时刻。对于很多   情况,这不是问题。作家排队。每个申请   它的数据库是否能够快速运行并继续运行,并且没有锁定   超过几十毫秒。但是有一些应用程序   这需要更多的并发性,而这些应用程序可能需要寻求   一个不同的解决方案。

答案 1 :(得分:-1)

对所有线程只使用一个sqlite数据库连接,使用标志SQLITE_OPEN_FULLMUTEX设置打开。 然后,数据库将序列化来自所有线程的写入,并且不会发生锁定。 但是您需要调整数据库和应用程序设计,以便编写查询运行得足够快,需要多少。