2012-07-13 178 views
0

我每秒都在收集數據並將其存儲在「:memory」數據庫中。將數據插入此數據庫位於事務中。連接兩個內存數據庫

每次有一個請求發送到服務器,服務器將從第一個內存中讀取數據,進行一些計算,將其存儲在第二個數據庫中,並將其發送回客戶端。爲此,我創建另一個「:memory:」數據庫來存儲第一個數據庫的聚合信息。我不能使用相同的分貝,因爲我需要做一些大的計算來獲得聚合結果。這不能在事務內完成(因爲如果一個集合需要5秒鐘,我將失去所有4秒鐘的數據)。我不能在同一個數據庫中創建表,因爲我將無法同時它正在收集並插入原始數據寫入彙總數據(它是內幕交易,它正在收集每1秒)

- 有時候,我想從兩個數據庫中檢索數據。我如何鏈接這兩個內存數據庫?使用附加數據庫stmt,我可以將第二個數據庫附加到第一個數據庫。但問題是下一次請求時,我將如何檢查第二個數據庫是否存在?

- 假設,我將第二個內存數據庫附加到第一個內存數據庫。當我們將數據寫入第一個數據庫時,它會鎖定第二個數據庫嗎?

- 有沒有其他的方式來存儲這些彙總數據?

回答

0

就我的想法而言,我認爲你根本不需要兩個數據庫。我想你錯誤地解釋了sql中事務的概念。

如果您正在開始一個事務,其他進程仍將被允許讀取數據。如果您正在讀取數據,則可能不需要數據庫鎖定。

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

  1. 插入一些數據到數據庫中(使用事務只爲 插入過程)
  2. 在數據庫上執行重計算(但不使用事務,否則將阻止插入任何的其他進程數據到您的數據庫)。即使此步驟包含非常大的計算,仍可以使用另一個進程插入和讀取數據,因爲SELECT語句不會鎖定您的數據庫。
  3. 結果寫入數據庫(再次,通過使用交易)

只要確保重計算不是一個事務中執行。

如果你想這個解決方案的更詳細的描述,看看有關的sqlite3的文件鎖定行爲的文檔:http://www.sqlite.org/lockingv3.html