0

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

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

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

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

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

4

1 回答 1

0

据我了解,我认为您根本不需要两个数据库。我想您误解了 sql 中事务的概念。

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

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

  1. 向数据库中插入一些数据(仅在插入过程中使用事务)
  2. 对数据库执行大量计算(但不要使用事务,否则会阻止其他进程将任何数据插入数据库)。即使这一步包括非常繁重的计算,您仍然可以使用另一个进程插入和读取数据,因为SELECT语句不会锁定您的数据库。
  3. 将结果写入数据库(同样,通过使用事务)

只需确保不在事务中执行繁重的计算。

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

于 2012-07-25T16:15:40.000 回答