我正在创建一个监控应用程序。我想从所有服务器读取查询并将其存储在sqlite文件中。只要需要就显示它。我使用c++编写此应用程序-从多个服务器获取和存储数据到单个sqlite数据库。我使用单独的线程从多个服务器获取数据。如果直接获取并将数据写入sqlite,那么它可能会锁定sqlite文件,因为100多个线程将同时进行写入。
如何以最佳方式从多个线程向sqlite写入数据?
如果您无法控制同时写入操作的数量,我认为使用sqlite没有更好的方法。
SQLite并不适用于您的用例。考虑切换到客户端/服务器关系型数据库管理系统。这也是SQLite建议的做法:
https://www.sqlite.org/whentouse.html
客户端/服务器关系数据库系统更适合的情况
客户端/服务器应用程序
如果有许多客户端程序通过网络发送SQL到同一个数据库,则使用客户端/服务器数据库引擎,而不是SQLite。SQLite可以在网络文件系统上工作,但由于大多数网络文件系统所带来的延迟,性能并不好。此外,在许多网络文件系统实现中(包括Unix和Windows),文件锁定逻辑存在错误。如果文件锁定无法正常工作,则两个或多个客户端可能会尝试同时修改同一数据库的同一部分,导致损坏。由于这个问题是由底层文件系统实现中的错误造成的,因此SQLite无法防止它。
一个好的经验规则是避免在同一个数据库将直接访问(没有介入应用程序服务器)且同时从许多计算机上进行访问的情况下使用SQLite。
(...)
高并发
SQLite支持无限数量的同时读取者,但它只允许一个写入者在任何时刻。对于许多情况来说,这不是问题。编写者排队等待。每个应用程序快速完成其数据库工作并继续执行,没有锁定持续时间超过几十毫秒。但是,有些应用程序需要更高的并发性,这些应用程序可能需要寻找不同的解决方案。
使用一个sqlite数据库连接来为所有线程服务,连接时设置标志 SQLITE_OPEN_FULLMUTEX。 这样,数据库将对所有线程的写操作进行序列化,从而避免锁定。 但是您需要调整数据库和应用程序的设计,使写入查询足够快,满足需求。
select
、epoll
、Overlapped IO或其它操作系统最佳支持的IO多路复用器来减少线程数量。 - user4581301