0

現在、マルチユーザー環境で SQLite を使用してデータベースをロックするという問題が発生しています。これらは、データベース ロックの例外の数を減らすためにジャーナリングがオフになっているという事実により、通常のデータベースの不正な問題と結びついています。

私の同僚は現在、同期アルゴリズムを実装して、ユーザーがローカルの SQLite データベースで作業し、そのデータをネットワーク上のマスター データベースにほぼ瞬時に転送できるようにしています。

ローカル行が変更されると、Sync フラグが true に設定されます。同期アルゴリズムは、毎秒実行されるタイマーによってトリガーされ、アップロードとダウンロードの 2 つの方法で構成されます。以下で説明する SQL コマンドはすべて、String.Format を使用して構築されています。

アップロード中に、ローカル データベースがスキャンされ、Sync フラグが true である行が検出されます。このような各行は、マスター データベースに更新または挿入されます (同じ PK を持つ行が見つかるかどうかによって異なります)。

ダウンロード中に、すべてのローカル テーブルが、行ごと、フィールドごとに、マスター データベース内の対応するテーブルと比較されます (比較を高速化するために、両方のテーブルが配列構造としてメモリに読み込まれます)。違いが見つかった場合、またはローカル行が欠落している場合、マスター データベースのデータを使用してローカル行が更新/挿入されます。

これでロックや奇形の問題が解決しないという明らかな事実を無視すると、私の直感では、これはひどい考えだとわかりますが、権力者にこれを説明するのに苦労しています。なぜこれがひどいアイデアなのか、あるいは私が見落としていたいくつかのポジティブな点について、誰かが何らかの理由を提供できますか.

4

1 に答える 1

1

ジャーナリングをオフにしても、ロックの競合の数は減りません。ロックの例外が確実なデータベースの破損に変わるだけです。

ロックの競合を処理する正しい方法は、他の接続が変更を完了するまで待つことです。System.Data.SQLite を使用する場合、これDefault Timeoutは接続文字列のように設定でき、デフォルトは 30 秒です (XPO が使用するドライバーはわかりません)。それでも十分な同時実行性が得られない場合は、MySQL や PostgreSQL などのクライアント/サーバー DB に切り替える必要があります。

同期ダウンロードはばかげています。とにかくデータベース全体を読み取っているので、データベース ファイル全体をローカル マシンにコピーする方が簡単で高速です。


The Authoritiesの言葉があなたの PHB を説得する可能性が高いと思われる場合は、 sqlite-users メーリング リストでこの質問をしてください。

于 2012-10-18T14:16:35.640 に答える