0

毎秒データを収集し、「:memory」データベースに保存しています。このデータベースへのデータの挿入は、トランザクション内で行われます。

1 つのリクエストがサーバーに送信されるたびに、サーバーは最初のメモリからデータを読み取り、何らかの計算を行い、それを 2 番目のデータベースに格納して、クライアントに送り返します。このために、別の ":memory:" データベースを作成して、最初のデータベースの集計情報を格納します。集計結果を取得するには大規模な計算を行う必要があるため、同じデータベースを使用することはできません。これはトランザクション内では実行できません (1 つのコレクションに 5 秒かかると、4 秒のデータがすべて失われるため)。元のデータを収集して挿入している間は集計データを書き込むことができないため、同じデータベースにテーブルを作成できません(トランザクション内にあり、1秒ごとに収集しています)

-- 両方のデータベースからデータを取得したい場合があります。これらの両方のメモリ データベースをリンクするにはどうすればよいですか? attach database stmt を使用して、2 番目のデータベースを最初のデータベースに接続できます。しかし、問題は次回リクエストが来たときに、2番目のデータベースが存在するかどうかをどのように確認するのでしょうか?

-- 2 番目のメモリ データベースを最初のメモリ データベースに接続するとします。最初のデータベースにデータを書き込むと、2 番目のデータベースがロックされますか?

-- この集計データを保存する他の方法はありますか??

4

1 に答える 1

0

私があなたの考えを理解した限りでは、2 つのデータベースはまったく必要ないと思います。SQLのトランザクションの考え方を誤解していると思います。

トランザクションを開始している場合、他のプロセスは引き続きデータを読み取ることができます。データを読み取っている場合は、おそらくデータベース ロックは必要ありません。

考えられるワークフローは次のようになります。

  1. データベースにデータを挿入します (挿入プロセスのためだけにトランザクションを使用します)。
  2. データベースで大量の計算を実行します (ただし、トランザクションは使用しないでください。トランザクションを使用しないと、データベースにデータを挿入する他のプロセスが妨げられます)。このステップに非常に重い計算が含まれている場合でも、SELECTステートメントによってデータベースがロックされないため、別のプロセスを使用してデータを挿入および読み取ることができます。
  3. 結果をデータベースに書き込みます (ここでも、トランザクションを使用します)。

トランザクション内で重い計算が実行されないように注意してください。

このソリューションの詳細な説明が必要な場合は、sqlite3 のファイル ロック動作に関するドキュメントを参照してください: http://www.sqlite.org/lockingv3.html

于 2012-07-25T16:15:40.000 に答える