我正在创建一个监控应用程序。我想从所有服务器读取查询并将其存储在sqlite文件中。在需要时显示它。我使用c ++编写这个应用程序 - 从多个服务器获取和存储数据到一个sqlite数据库。我使用单独的线程从多个服务器获取数据。如果我直接获取并向sqlite写入数据,那么它可能会锁定sqlite文件,因为100个线程将同时写入。 从多个线程向sqlite写入数据的最佳方法是什么?
答案 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设置打开。 然后,数据库将序列化来自所有线程的写入,并且不会发生锁定。 但是您需要调整数据库和应用程序设计,以便编写查询运行得足够快,需要多少。