我每秒收集数据并将其存储在“:memory”数据库中。将数据插入此数据库是在事务中。
每次有一个请求发送到服务器,服务器将从第一个内存中读取数据,进行一些计算,将其存储在第二个数据库中并将其发送回客户端。为此,我创建了另一个“:memory:”数据库来存储第一个db的聚合信息。我不能使用相同的数据库,因为我需要做一些大的计算来获得聚合结果。这不能在事务内部完成(因为如果一个集合需要5秒钟,我将丢失所有4秒数据)。我无法在同一个数据库中创建表,因为在收集和插入原始数据时,我将无法编写聚合数据(它在内部事务中并且每隔一秒收集一次)
- 有时我想从两个数据库中检索数据。如何链接这两个内存数据库?使用attach database stmt,我可以将第二个db附加到第一个db。但问题是下次请求时如何检查第二个数据库是否存在?
- 假设,我将第二个内存数据库附加到第一个内存数据库。当我们将数据写入第一个数据库时,它会锁定第二个数据库吗?
- 有没有其他方法来存储这个聚合数据?
答案 0 :(得分:0)
据我所知,我认为你根本不需要两个数据库。我想你是在误解sql中的事务的想法。
如果您正在开始交易,其他流程仍然可以读取数据。如果您正在读取数据,则可能不需要数据库锁定。
可能的工作流程如下所示。
SELECT
语句不会锁定您的数据库。确保在交易中不执行繁重的计算。
如果您想要更详细地了解此解决方案,请查看有关sqlite3的文件锁定行为的文档:http://www.sqlite.org/lockingv3.html