3

プロジェクトでは、サーバーとクライアント間の通信を変更する必要があります。

実際には、テーブルのコンテンツ全体をクライアントに送信するのは、コンソール アプリケーションでホストされる WCF サービスであり、クライアントはすべてのローカル キャッシュを新しいコンテンツに置き換えます。

クライアント アプリケーションはオフラインで動作できます (ディスク上でのシリアル化によって永続化されるロケール キャッシュがあり、接続後にサーバーに送信する必要があるすべての変更を格納するトランザクション リストもあります)。

問題は、この同期が GSM 接続で発生し、テーブル コンテンツ全体の送信が非常に重くなることです。

したがって、これをすべて自分で実装するか(変更日の設定、最終同期日の保存、更新されたフィールドのみの取得、キャッシュの更新)、標準的な方法を見つけることができます。専用ライブラリは、私が持っていなかった多くのシナリオをすでに考えているので、より良い仕事をすると思います。

同期層は結合度が低いので、仕組みを変えても大したことはありません。

私のプロジェクト要件は次のとおりです。

  • 増分同期が必要です
  • 変更をサーバーにプッシュできます
  • オフラインで情報にアクセス/保存
  • 完全な再同期を行う可能性 (破損したキャッシュ、または新しいコンピューター)
  • サーバー側のデータ プロバイダーは Entity Framework です
  • 現在のカスタム認証を再利用する必要がある
  • おまけ: 一部のタイプには特別な同期があります (たとえば、小さなファイルを含むデータベースがありますが、クライアント側では、ファイルをフォルダーに直接配置する必要があります)。

どんなものがあるのか​​ちょっと調べてみました。

Microsoft Sync Framework についていくつか見つけましたが、非常に ADO.Net 指向のようで、エンティティ サービスからデータを取得してシリアル化されたキャッシュに入れることができるかどうかはわかりません。

そう:

仕事をするためのフレームワークまたはライブラリを教えてもらえますか? または、私のニーズに関して、私はむしろこれを自分で実装する必要があると思いますか?

4

3 に答える 3

7

過去に、同様の N 層の不定期接続クライアントに Microsoft Sync Framework を使用したことがありますが、うまくいきました。私が最後に使用して以来、それは進んでいますが、これがあなたの要件にどのように応えているかを私が見る方法です.

WCF

WCF で問題なく動作します。これが使用方法です。(方法: N 層同期を構成する)

増分同期が必要です

同期サービスはこれをうまく処理しますが、同期テーブルにタイムスタンプを追加する必要がある場合があります。クライアント データベース (私の場合は SQL Server CE データベース) は、最後に同期したときに使用された最後のタイムスタンプを保持し、これを使用して、次回の同期中に変更されたすべてのものを取得します。

変更をサーバーにプッシュできます

繰り返しますが、これを行いました。データを検証するためにサーバーにカスタム ロジックを提供するためのフックがたくさんあります。

オフラインで情報にアクセス/保存

完全に切断されたシナリオで正常に動作します (ユーザーが最初にデータを既に同期している場合)。オフライン シナリオを参照してください。

完全な再同期を行う可能性 (破損したキャッシュ、または新しいコンピューター)

すべての同期情報を保持するのはクライアント データベースです (必要に応じて、クライアントが何を同期したかについての情報をサーバーに入れることができます)。ローカル データベースを削除すると、クライアントは完全同期を実行します。

サーバー側のデータ プロバイダーは Entity Framework です

これは私が使用した方法ではありませんが、同期プロバイダーは完全にカスタマイズ可能です. NHibernate を実行することを検討するつもりでしたが、なぜこれを実行したいのか自問してください。すぐに使用できる Sync Services を使用すると、ストアド プロシージャまたは直接テーブル クエリを使用してデータをプッシュおよびプルできます。これはセットアップが非常に簡単で、大量のデータを使用する可能性があるため、実行が非常に高速であり、WCF 境界を越えてデータを簡単に同期できます (ただし、パフォーマンスを向上させるために xml フォーマッターからバイナリ フォーマッターに切り替えました)。

私たちが見つけたのは、サーバーでエンティティを使用したからといって、クライアントでは必ずしも意味がなく、クライアントにまったく新しいエンティティのセットがあったということです。これは、ストアド プロシージャ内のクライアントで不要なデータを取り除いていたことも意味します。これも非常に簡単で、ADO.net をいじる必要はありません。次に、データがクライアントにあると、NHibernate を使用してローカル データベースの読み取りと書き込みを行いました。

Microsoft Sync Framework のカスタム同期プロバイダーの構築

現在のカスタム認証を再利用する必要がある

WCF カスタム認証を意味する場合は、そうです。独自の WCF カスタム セキュリティ トークンがあり、影響なく正常に機能したからです。

おまけ: 一部のタイプには特別な同期があります (たとえば、小さなファイルを含むデータベースがありますが、クライアント側では、ファイルをフォルダーに直接配置する必要があります)。

私が使用していない新しいフレームワークのファイル同期プロバイダーであるため、簡単な回答はわかりませんが、他に2つのオプションがあります。

  1. クライアントでの同期中に、データがテーブルに配置されるポイントに実際にフックすることができ、バイナリ データをプルして、データベースではなくファイル システムに書き込むことができます。

  2. ファイル バイナリ データを同期から除外し、同期後に別のプロセスを使用してこのデータを取得します。これは、取得するパッケージが非常に大きいため、最初の同期を使用して「メタデータ」を取得し、次にWindows の一部であるBITSと呼ばれるものを使用してファイルを非同期的に取得したためです。

Microsoft Sync Framework ファイル同期プロバイダーの概要

[アップデート]

コメントで提起された質問に答えて。

  1. 私のアプリケーションは、同じコンピューター上のさまざまなユーザーに対して機能する必要があります。私の場合、別の場所で動作することを保証するために分離ストレージを使用していましたが、これは SQL Server CE で可能ですか?

    私たちのアプリケーションは ClickOnce を介して展開されました。これにより、ユーザーごとにアプリケーションの個別のインストールが提供されますが、それが求められているとは思いません。SQL CE は単なるメモリ内データベースSqlCeEngineです。ロードするデータベース ファイルをポイントするので、分離ストレージは完璧です。

  2. 私の知る限り、SQL Server CE は SQLite に似ていますが、スキーマの作成をどのように管理していますか?

    必要に応じて Snyc Services にデータベース スキーマを作成させることもできます。これで作業を進めるには十分ですが、長い目で見れば、ある時点でスキーマを変更しなければならない可能性があります。これはおそらくアップグレードを行うときになるため、早い段階で検討することをお勧めします。私は、データベースを同期サービスに属するものとは考えず、同期サービスが使用できるように指示されたものとして考えることで、これに対処しました。

    アプリケーションが起動すると、データベースが存在しない場合はデータベースを作成したり、アプリケーションがアップグレードされたばかりの場合はデータベース スクリプトを実行したりするなど、ハウスキーピングが行われました。

  3. この N 層同期のクラス実装の例がどこかにあるかどうか知っていますか? 実装する必要があるインターフェイスを確認する必要があります。

    現在の安定版リリースは 2.1 で、ちょうど 2.0 が出たときにそれを使用していたので、私の作業はすべて 1.0 でした。MSDN のMicrosoft Sync Framework 2.1 APIへのリンクを次に示します。1.0 ドキュメントを使用して、WCF インターフェイスを追い出すために使用した例を見つける必要があったため、どこまで変更されたかはわかりませんが、これを使用て、インターフェイスを次のように定義することから始めることができます。

    [ServiceContract] public interface IServiceForSync { [OperationContract()] SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession);

    [OperationContract()]
    SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession);
    
    [OperationContract()]
    SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession);
    
    [OperationContract()]
    SyncServerInfo GetServerInfo(SyncSession syncSession);
    

    }

  4. データ型ごとに 1 つのサービスだと思いますか?

いいえ、上からわかるように、サービスは 1 つだけです。何を同期するかは、サーバー上で何を公開するか、およびクライアントが何に参加したいかによって異なります。たとえば、2 つのクライアントがあり、1 つはデータの小さなサブセットにのみ関心があり、いくつかのテーブルの同期にのみ参加しました (と呼ばれます)。 a SyncTable) もう一方はすべてのテーブルを同期しました。

の概念もありますSyncGroup。これらは関連する変更で構成されており、それらはすべて関連しているため、トランザクションとして永続化する必要があります。つまり、1 つが失敗するとすべてが失敗します。すべてを同期しなくても、グループを個別に同期することもできます。

  1. ユーザーに関連するデータのみを同期できますか?

絶対。同期を行うときはSyncParameter、クライアントに返されるデータをフィルタリングするために使用できる値を含む を渡します。方法: 行と列をフィルター処理します

于 2012-06-12T12:36:36.327 に答える
0

サーバーを展開して公開する方法、またはその方法に応じて、 SQL Server レプリケーションを使用できます。

アプリケーションについて心配している間、レプリケーションは面倒なレプリケーション タスクをすべて処理してくれます。

SQL Express のインストールを検討し、マージ レプリケーションを使用することもできます。

編集 パラメーター化されたフィルターを使用してレプリケートされるデータを管理し、ブートストラップを使用して SQL Express を前提条件としてインストールします。どうやら Microsoft は SQL Express のブートストラップを提供していなかったようです。

于 2012-06-12T09:35:49.220 に答える
0

このDatabase Sync: SQL Server and SQL Compact N-Tier with WCFを見たことがありますか?

フィルタリングもそれほど難しくありません。次を参照してください:チュートリアル: フィルタリングされたスコープの定義とプロビジョニング サーバーおよびチュートリアル: フィルタリングされたスコープを使用したクライアントのプロビジョニング

于 2012-06-12T11:19:01.523 に答える