クライアントとサーバーの同期のアーキテクチャとクラス

Sync Framework を使用すると、SQL Server Compact クライアント データベースとサーバー データベースやその他のデータ ソース (株価を XML で提供するサービスなど) の間で同期を実行できるようになります。2 つのデータベースの同期に備え、Sync Framework では、ADO.NET プロバイダーが対応している任意のサーバー データベースを使用した 2 層または N 層のアーキテクチャがサポートされています。クライアント データベースと他の種類のデータ ソースの間での同期については、サービスベースのアーキテクチャがサポートされています。このアーキテクチャでは、2 層アーキテクチャおよび N 層アーキテクチャの場合より多くのアプリケーション コードが必要になりますが、同期に異なる方法を使用する必要はありません。

次の図は、2 層、N 層、およびサービスベースの各アーキテクチャにかかわるコンポーネントを示しています。それぞれの図は 1 つのクライアントを示していますが、1 つのサーバーと同期するクライアントが複数存在することもよくあります。Sync Framework では、クライアントとサーバー データベースの同期にハブ アンド スポーク型モデルが使用されます。同期は、常にクライアントによって開始されます。各クライアントからの変更はすべて、サーバーと同期された後、サーバーから他のクライアントに送信されます (クライアント間で変更を直接交換することはありません)。

クライアントとサーバーのシナリオの場合、Sync Framework では、スナップショットの同期、ダウンロードのみの同期、アップロードのみの同期、および双方向同期が可能です。

  • スナップショットの同期とダウンロードのみの同期は、通常、製品リストなどの参照データをクライアント側で格納および更新するために使用されます。サーバーで行われたデータ変更は、同期中にクライアント データベースにダウンロードされます。スナップショットの同期では、クライアントが同期されるたびにデータが完全に更新されます。この同期方法は、増分変更を追跡する必要がない場合またはサーバーで増分変更を追跡できない場合に適しています。ダウンロードのみの同期では、前回の同期以降に発生した増分変更のみがダウンロードされます。

  • アップロードのみの同期は、通常、販売注文などのデータをクライアントで挿入するために使用されます。クライアント データベースで行われる挿入およびその他のデータ変更は、同期中にサーバーにアップロードされます。

  • 双方向同期は、通常、顧客の連絡先情報など、クライアントとサーバーで更新できるデータに使用されます。競合するすべての変更を同期中に処理する必要があります。

同期の種類の詳細については、「スナップショット、ダウンロード、アップロード、および双方向の各同期を指定する方法」を参照してください。クライアントとサーバーの同期用の Sync Framework アーキテクチャは、非対称的です。つまり、クライアント データベースには変更追跡が組み込まれていますが、増分変更をダウンロードする場合はサーバー データ ストアで変更を追跡する必要があります。変更追跡の詳細については、「サーバー データベースの変更の追跡」を参照してください。

アーキテクチャ図のコンポーネント

アーキテクチャ図に示されているコンポーネントには、クライアント データベース、サーバー データベース、および Sync Framework データベース同期 API の一連のクラスがあります。N 層およびサービスベースのアーキテクチャには、Web サービス コンポーネントとトランスポート コンポーネントも含まれていますが、これらについては独自に作成する必要があります。

2 層アーキテクチャ

最初の図は、クライアント データベースとサーバー データベースを使用する 2 層アーキテクチャを示しています。

2 層同期トポロジ

この 2 つのデータベースを除いて、図に記載されているすべての項目は Sync Framework のクラスに対応しています。これらのクラスは、次の DLL に含まれています。

  • Microsoft.Synchronization.Data.dll には、同期エージェント、同期テーブル、および同期グループが含まれています。

  • Microsoft.Synchronization.Data.SqlServerCe.dll には、クライアント同期プロバイダーが含まれています。

  • Microsoft.Synchronization.Data.Server.dll には、サーバー同期プロバイダーおよび同期アダプターが含まれています。

すべての DLL は、.NET Framework 2.0 以降のバージョンの System.dll と System.Data.dll に依存します。また、Microsoft.Synchronization.Data.SqlServerCe.dll は SQL Server Compact の System.Data.SqlServerCe.dll に依存します。2 層アプリケーションでは、すべての Sync Framework DLL がクライアント上に存在します。N 層アプリケーションでは、Microsoft.Synchronization.Data.dll および Microsoft.Synchronization.Data.Server.dll が、同期サービスを提供する別のコンピューターに存在します。

N 層アーキテクチャ

N 層アーキテクチャを 2 番目の図に示します。このアーキテクチャでは、クライアント データベースとサーバー データベース間の通信にプロキシ、サービス、およびトランスポート メカニズムが必要です。このアーキテクチャは 2 層アーキテクチャよりも一般的です。これは、N 層アーキテクチャでは、クライアント データベースとサーバー データベース間で直接通信する必要がないためです。

N 層同期トポロジ

サービスベースのアーキテクチャ

サービスベースのアーキテクチャを 3 番目の図に示します。このアーキテクチャには、クライアント データベースは含まれていますが、サーバー データベースまたは対応するサーバー同期プロバイダーや同期アダプターは含まれていません。この種類のアーキテクチャを使用するには、アプリケーションが、カスタム プロキシとカスタム サービスを通じて同期エージェントと通信できる必要があります。これらは、サーバー同期プロバイダーおよび同期アダプターが通常提供するのと同じ機能 (同期する変更の取得など) を提供する必要があります。

サービスに基づく同期トポロジ

クライアント データベース

Sync Framework アプリケーションのクライアント データベースは、SQL Server Compact の 64 ビット バージョンを含む SQL Server Compact 3.5 SP1 以降のバージョンです。Sync Framework には、クライアント データベースの増分変更を追跡するインフラストラクチャが用意されています。このインフラストラクチャは、スナップショットの同期以外の方法を使用して初めてテーブルを同期するときに有効になります。既定では、Sync Framework がクライアント データベースで必要とするメタデータは 10 日間保存されます。メタデータの保有の詳細については、「RetentionInDays」を参照してください。

サーバー データベース

サーバー データベースには、ADO.NET プロバイダーが対応している任意のデータベースを使用できます。サーバー データベースの増分変更を追跡する場合は、データベースでその準備をする必要があります。詳細については、「サーバー データベースの変更の追跡」を参照してください。

Sync Framework クラス

上記の図には、SyncAgentSqlCeClientSyncProviderDbServerSyncProviderSyncTableSyncGroup、および SyncAdapter クラスが示されています。これらのクラスを同じアプリケーションで使用する方法の例については、「はじめに : クライアントとサーバーの同期」を参照してください。

同期エージェント

同期エージェントでは、次の方法で同期が実行されます。

  • 同期する各テーブルをループ処理します。

  • クライアント同期プロバイダーを呼び出してクライアント データベースで変更を取得および適用します。

  • サーバー同期プロバイダーを呼び出してサーバー データベースで変更を取得および適用します。

また、同期エージェントでは、セッション レベルの同期情報が保持され、クライアント上のアプリケーションに成功のメッセージ、エラー、および統計情報が提供されます。詳細については、「SyncAgent」および「スナップショット、ダウンロード、アップロード、および双方向の各同期を指定する方法」を参照してください。

クライアント同期プロバイダー

クライアント同期プロバイダーは、クライアントと通信し、同期エージェントに対してクライアント データベースの特定の実装が明らかにならないようにします。Sync Framework には、SQL Server Compact データベースのプロバイダーが含まれています。クライアント同期プロバイダーの主要な動作は次のとおりです。

  • クライアント上の同期可能なテーブルに関する情報を格納します。

  • 前回の同期以降にクライアント データベースで発生した変更を取得します。

  • クライアント データベースに増分変更を適用します。

  • 競合する変更を検出します。

詳細については、SqlCeClientSyncProvider のトピックおよび「スナップショット、ダウンロード、アップロード、および双方向の各同期を指定する方法」を参照してください。

サーバー同期プロバイダー

サーバー同期プロバイダーは、サーバーと通信し、同期エージェントに対してサーバー データベースの特定の実装が明らかにならないようにします。サーバー同期プロバイダーの主要な動作は次のとおりです。

  • サーバー上の同期可能なテーブルに関する情報を格納します。

  • 前回の同期以降にサーバー データベースで発生した変更をアプリケーションで取得できるようにします。

  • 増分変更をサーバー データベースに適用します。

  • 競合する変更を検出します。

詳細については、DbServerSyncProvider のトピックおよび「スナップショット、ダウンロード、アップロード、および双方向の各同期を指定する方法」を参照してください。

同期テーブルと同期グループ

同期テーブルは、同期対象のテーブルごとに定義します。同期テーブルには、同期の方向などの設定が格納されます。各クライアントでは、必要なテーブルのみを要求できます。これには、サーバー同期プロバイダーによって使用可能となるすべてのテーブルが含まれるとは限りません。たとえば、20 個のテーブルが存在し、そのうちの 10 個のテーブルがサーバー同期プロバイダーで双方向同期用に構成されているとします。ところが、クライアントは、ダウンロードのみの同期として 12 個のテーブルしか要求しない可能性もあります。サーバーではアップロードがサポートされていますが、クライアントでは、変更を行ったり、すべてのテーブルを同期したりする必要がありません。詳細については、SyncTable のトピックを参照してください。

同期テーブルは、定義した後、同期グループに追加できます。同期グループとは、一連のテーブルに対する変更が一貫して適用されるようにするメカニズムです。テーブルが同期グループに含まれている場合、これらのテーブルに対する変更はまとめて転送され、サーバーにおいて 1 つのトランザクション内で適用されます。グループ内のいずれかの変更が失敗すると、グループ全体に対する変更が次の同期時に再試行されます。詳細については、SyncGroup のトピックおよび「スナップショット、ダウンロード、アップロード、および双方向の各同期を指定する方法」を参照してください。

同期アダプター

同期アダプターは、ADO.NET のデータ アダプターをモデルとしており、同期対象のテーブルごとに定義します。同期アダプターにより、クライアント データベースからサーバー データベースに挿入を適用する InsertCommand など、サーバー データベースの操作に必要な特定のコマンドがサーバー同期プロバイダーに指定されます。同期アダプターでは ADO.NET DbCommand オブジェクトが使用されるので、ADO.NET によってサポートされる任意のコマンド構造を使用できます。この構造には、インライン Transact-SQL、ストアド プロシージャ、ビュー、関数などが含まれます。コマンドが必要とするのは、転送および適用に使用する構造とデータを定義するための、単一の結果のみです。詳細については、SyncAdapter のトピックおよび「スナップショット、ダウンロード、アップロード、および双方向の各同期を指定する方法」を参照してください。

プロキシ、サービス、トランスポート

プロキシ、サービス、トランスポートは、N 層アーキテクチャとサービスベースのアーキテクチャで使用されます。N 層アプリケーションでは、Microsoft.Synchronization.Data.Server.dll が使用されますが、これはクライアント上に存在しません。通常、この DLL は、サーバー データベースに直接接続する中間層に存在します。この場合、クライアントと中間層の間で通信を行うために、プロキシとサービスが必要になります。

  • クライアントでは、アプリケーション コードは、直接プロバイダーを参照するのではなく、サーバー同期プロバイダーのプロキシ (ServerSyncProviderProxy) を参照します。このプロキシは、中間層にあるサービスと通信します。

  • 中間層では、サービスが ServerSyncProvider (DbServerSyncProvider の継承元の抽象クラス) と同じメソッドを継承してこれを公開します。その後、サーバー同期プロバイダーのメソッドは、サーバー データベースと直接接続することで実行されます。結果は、中間層を経由してクライアントに返されます。

詳細については、「N 層同期を構成する方法」を参照してください。

サービスベースのアプリケーションでは、クライアント上の Microsoft.Synchronization.Data.Server.dll が使用されません。アプリケーション コードは、サーバー同期プロバイダーおよび同期アダプターが通常提供するのと同じ機能を提供する必要があります。

  • クライアントでは、アプリケーション コードは、データ ソースからの変更の取得など、サーバー同期プロバイダーのタスクを処理するアプリケーション コード用のプロキシを参照します。このプロキシは、中間層にあるサービスと通信します。

  • 中間層では、サービスが ServerSyncProvider (DbServerSyncProvider の継承元の抽象クラス) と同じメソッドを継承してこれを公開します。その後、このメソッドは、サーバー データベースと直接接続することで、アプリケーション コードによって実行されます。結果は、中間層を経由してクライアントに返されます。

API のその他のクラス

このトピックの図では、API の主要なクラスを示していますが、ここでは示されていないクラスも多数あります。使用可能なすべてのクラスに関する情報を入手するには、Microsoft.SynchronizationMicrosoft.Synchronization.DataMicrosoft.Synchronization.Data.SqlServerCe、および Microsoft.Synchronization.Data.Server の各トピックを参照してください。次のセクションでは、理解しておく必要のある他の 4 つの重要なクラスについて説明します。

同期アンカー

同期アンカーは、サーバーから同期される一連のテーブルへの参照ポイントです。同期アンカーを使用すると、アプリケーションは、特定のセッションでどの変更を同期する必要があるかを決定できるようになります。同期中、クライアント同期プロバイダーによって、次の参照ポイントがクライアント データベースに格納されます。

  • 最後に受け取ったアンカー
    サーバーから最後にダウンロードされた変更を特定します。
  • 最後に送信されたアンカー
    クライアントから最後にアップロードされた変更を特定します。

次回の同期時に、アプリケーションは、これらのアンカーを使用して、次の一連の変更を同期する開始位置を特定できます。詳細については、「SyncAnchor」および「サーバー データベースの変更の追跡」を参照してください。

同期セッションの統計情報

セッションの統計情報は、同期エージェントから各同期セッションに提供される一連の統計情報です。この統計情報には、同期時間、処理された変更の数、および発生した競合や例外に関する情報が含まれます。詳細については、SyncStatistics のトピックおよび「イベントを操作する方法とビジネス ロジックをプログラムする方法」を参照してください。

同期セッション変数

セッション変数は、サーバーで実行される選択、挿入、更新、および削除の各コマンドのパラメーターとして開発者が使用するために用意されている変数です。この変数は、競合検出をサポートしたり、変更が複数回クライアントにダウンロードされないようにしたりする場合に使用できます。詳細については、SyncSession のトピックおよび「セッション変数を使用する方法」を参照してください。

SQL Server 同期アダプター ビルダー

同期アダプター ビルダーは、ADO.NET のコマンド ビルダーをモデルとしており、サーバー同期プロバイダーによって実行される同期コマンドのコード開発に役立ちます。同期プロバイダー アダプター ビルダーでは、SQL Server データベース用の SELECT、INSERT、UPDATE、DELETE の各ステートメントが作成されます。こうしたステートメントは、同期にかかわるテーブルに関して指定された情報に基づいて作成されます。詳細については、SqlSyncAdapterBuilder のトピックおよび「アプリケーション開発に役立つツール」を参照してください。

参照

概念

オフラインのシナリオ
はじめに : クライアントとサーバーの同期