0

外部接続が制限されているデータベース(最大5つ)があります。そのため、すべてのデータベース操作を維持するサーバーアプリケーションを導入しました。そのサーバーは、コールバックを伴うWCFサービスを使用して、すべての変更をクライアントに通知します。クライアントは、データベースのローカルコピーをシリアル化された辞書に保存します。すべてが正常に機能し、1つのクライアントまたはサーバーが変更を実行すると、他のすべてのクライアント/サーバーにほぼ瞬時に通知されます。問題は、クライアントが同期しなくなることがあり、それを修復する唯一の方法は、データベースのローカルコピーを削除することです(サーバー上にある場合もあります)。一部のオブジェクトがデータベースから削除されたときに発生することがわかりました。自動更新でdatetimeを使用して変更された行を検索しますが、これは削除されたオブジェクトではうまく機能しません。1つのテーブルに160000を超える行があるため、それらをローカルコピーと比較するのは...面倒です。だから質問は:

1)データベースのローカルコピーを作成および維持するための優れたアルゴリズム(実際のデータベースとサーバー間、およびサーバーとクライアント間)を誰かに教えてもらえますか(レプリケーションは使用できません)

2)シリアル化された辞書よりもローカルに保存する方が良い方法です(すべてのデータが読み込まれると、アプリは多くのスペースを必要とします)

PS。データベースなしでいくつかの解決策を考えましたが、私は常にそのローカルコピーが必要であるという結論に達しました。

4

1 に答える 1

0

1)データベースのローカルコピーを作成および維持するための優れたアルゴリズム(実際のデータベースとサーバー間、およびサーバーとクライアント間)を誰かに教えてもらえますか(レプリケーションは使用できません)

あなたの場合の最も簡単な解決策は、IsDeletedデータテーブルに列を追加することかもしれません。その場合(その新しい列のサポートを追加することを除いて)同期プロセスを更新しないでください。ただし、SQLクエリを「IsDeleted =1ではない」where句で更新する必要があります。

DeletionDateオブジェクトがいつ削除されたかを追跡する場合は、「and DeletionDateisnotnull」を使用することもできます。

このアプローチには制限がありますが、同期アルゴリズムは影響を受けないため、削除されたレコードの問題に対して最も費用効果の高いソリューションになる可能性があります。

2)シリアル化された辞書よりもローカルに保存する方が良い方法です(すべてのデータが読み込まれると、アプリは多くのスペースを必要とします)

データをメモリに保存することが適切でない場合は、ファイルを使用します。フラットなTXTファイルまたはXMLは、ビッグデータセットには適していません。コンパクトなRDBMSまたはNo-SQLデータベースを使用できます。私はNo-SQLにあまり詳しくないので、ここでアドバイスすることはできません。MS SQL Compact 4.0は、ケースで使用できるほど軽量です。使用を開始するには、いくつかのDLLのみをクライアントマシンにコピーする必要があり、MSSQLエクスペリエンスは引き続き適用できます。

http://msdn.microsoft.com/en-us/library/aa983326(v=vs.110).aspx

于 2012-06-12T15:54:26.223 に答える