2012-07-13 123 views
0

我每秒都在收集数据并将其存储在“:memory”数据库中。将数据插入此数据库位于事务中。连接两个内存数据库

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

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

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

- 有没有其他的方式来存储这些汇总数据?

回答

0

就我的想法而言,我认为你根本不需要两个数据库。我想你错误地解释了sql中事务的概念。

如果您正在开始一个事务,其他进程仍将被允许读取数据。如果您正在读取数据,则可能不需要数据库锁定。

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

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

只要确保重计算不是一个事务中执行。

如果你想这个解决方案的更详细的描述,看看有关的sqlite3的文件锁定行为的文档:http://www.sqlite.org/lockingv3.html