附加两个内存数据库

时间:2012-07-13 12:50:44

标签: sqlite

我每秒收集数据并将其存储在“:memory”数据库中。将数据插入此数据库是在事务中。

每次有一个请求发送到服务器,服务器将从第一个内存中读取数据,进行一些计算,将其存储在第二个数据库中并将其发送回客户端。为此,我创建了另一个“:memory:”数据库来存储第一个db的聚合信息。我不能使用相同的数据库,因为我需要做一些大的计算来获得聚合结果。这不能在事务内部完成(因为如果一个集合需要5秒钟,我将丢失所有4秒数据)。我无法在同一个数据库中创建表,因为在收集和插入原始数据时,我将无法编写聚合数据(它在内部事务中并且每隔一秒收集一次)

- 有时我想从两个数据库中检索数据。如何链接这两个内存数据库?使用attach database stmt,我可以将第二个db附加到第一个db。但问题是下次请求时如何检查第二个数据库是否存在?

- 假设,我将第二个内存数据库附加到第一个内存数据库。当我们将数据写入第一个数据库时,它会锁定第二个数据库吗?

- 有没有其他方法来存储这个聚合数据?

1 个答案:

答案 0 :(得分:0)

据我所知,我认为你根本不需要两个数据库。我想你是在误解sql中的事务的想法。

如果您正在开始交易,其他流程仍然可以读取数据。如果您正在读取数据,则可能不需要数据库锁定。

可能的工作流程如下所示。

  1. 将一些数据插入数据库(仅使用一个事务 插入过程)
  2. 对数据库执行繁重的计算(但不要使用事务,否则会阻止将任何数据插入数据库的其他进程)。即使此步骤包含非常繁重的计算,您仍然可以使用其他进程插入和读取数据,因为SELECT语句不会锁定您的数据库。
  3. 将结果写入数据库(再次,使用交易)
  4. 确保在交易中不执行繁重的计算。

    如果您想要更详细地了解此解决方案,请查看有关sqlite3的文件锁定行为的文档:http://www.sqlite.org/lockingv3.html