2016-09-30 104 views
0

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

+1

[The XY solution](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem):考虑用'select','epoll',重叠的IO减少线程数或任何IO多路复用器最适合您的操作系统。 – user4581301

+0

编辑我的问题。我不能减少线程数量,这取决于连接的服务器数量。 –

+1

没错,但是使用多路复用器,一个线程可以管理许多服务器。 – user4581301

回答

2

如果你不能控制同时写入操作的数量,我认为没有更好的方法来用sqlite做到这一点。

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

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

情况下如果有很多客户端程序的客户机/服务器RDBMS可能更

客户/服务器应用

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

一个好的经验规则是为了避免在相同的数据库将被直接从多台计算机通过网络 访问(没有中间 应用服务器),并同时情况使用SQLite。

(...)

高并发

SQLite支持同时读者的数量不受限制,但只允许一个作家在任何时刻。对于很多 的情况,这不是问题。作家排队。每个应用程序 都会快速完成其数据库工作并继续前进,并且不会发生超过几十毫秒的锁定,并且该锁定持续时间为 。但有一些应用程序需要更多的并发性,并且这些应用程序可能需要寻求 一个不同的解决方案。

-1

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

+0

FULLMUTEX是最锁定,而不是锁定。它也只影响连接对象,因为各种原因(每个线程应该有自己的连接),不应该在线程间共享连接对象。 –

+0

对于最后的数据库写操作,您始终锁定表行和/或表页,这可能会导致死锁。总是建议只有一个数据库写入器线程/进程或使用FULLMUTEX。 额外的改进可以是写入相同表的线程应该有锁定和线程写入不同的表。 对于读取操作,不需要序列化,它们可以并行运行。 – BJovke

+0

SQLite对整个数据库使用一个锁。不存在僵局的可能性。再次,'FULLMUTEX'保护_connection object_,它不应该在线程之间共享,因为它使得使用事务变得不可能。 –

相关问题