Microsoft Sync Framework同步數(shù)據(jù)庫 1:同步數(shù)據(jù)庫簡介
同步數(shù)據(jù)庫簡介
概述
Sync Framework 支持在數(shù)據(jù)庫之間進行同步。它提供了一個直觀且靈活的 API,使您可以生成面向脫機和協(xié)作方案的應用程序。通過該 API,您可以根據(jù)應用程序的體系結構和要求,使用所提供的所有或部分組件來完成同步工作。Sync Framework 支持客戶端-服務器、客戶端到客戶端和混合拓撲。在客戶端-服務器拓撲中,所有客戶端都與某一中央服務器同步。在客戶端到客戶端拓撲中,每個客戶端都可以與其他客戶端同步,而變更不必通過中央服務器來傳遞。混合拓撲由客戶端到客戶端拓撲和客戶端-服務器拓撲組合而成。
傳統(tǒng)的分布式系統(tǒng)
隨著計算機網(wǎng)路技術的飛速發(fā)展,特別是因特網(wǎng)計術的應用與普及,分布式計算機軟件已經(jīng)越來越重要了。畢竟,分布式技術為我們帶來了數(shù)據(jù)共享,使得交互與協(xié)作成為可能。對于一家企業(yè)來說,能夠支持移動和遠程工作人員正在變得越來越重要。組織機構應確保這些工作人員能夠像在辦公室時一樣訪問到相同的信息,這一點非常重要。在大多數(shù)情況下,這些用戶將使用便攜式計算機、辦公臺式機、smartphone 或 PDA,遠程用戶使用這些設備通過網(wǎng)絡訪問數(shù)據(jù)倉庫。但是這種傳統(tǒng)的分布式解決方案存在著如下這些嚴重缺陷而無法獲得滿意的效果:
- 網(wǎng)絡要求
若要使用戶能夠訪問信息,遠程設備在訪問數(shù)據(jù)時必須能夠不間斷地連接到公司網(wǎng)絡。對于某些工作人員(如在家辦公的人員),這可能并不是什么問題。但對于其他用戶(如經(jīng)常出差的銷售人員),就可能會比較困難。例如,如果某一銷售人員正在拜訪客戶,并且由于沒有網(wǎng)絡連接而無法訪問庫存數(shù)據(jù),該銷售人員將無法有效地完成工作。
- 數(shù)據(jù)訪問速度
在典型的客戶端-服務器公司環(huán)境中,用戶擁有可快速訪問信息的高速網(wǎng)絡。但是,遠程工作人員常常通過不太可靠的慢速網(wǎng)絡進行連接。在使用典型的解決方案時,每次當用戶需要一份數(shù)據(jù)時,都必須進行下載,因為無法將數(shù)據(jù)長久地保存到設備上。例如,銷售人員每次打開應用程序時,都必須下載其產(chǎn)品列表,而使用信息填充應用程序所需的時間可能非常長,這讓用戶非常苦惱。
- 單個故障點
使用這種解決方案時,用戶常常依賴于單個服務器數(shù)據(jù)庫。如果數(shù)據(jù)庫由于計劃的服務器停機或意外的服務器故障而無法使用,所有遠程工作人員與其數(shù)據(jù)的連接將會中斷。
- 服務器可伸縮性
隨著遠程工作人員的數(shù)量不斷增加,公司服務器的性能將會受到影響,并且可能需要添加更多的硬件。
偶爾連接的應用程序
現(xiàn)在對于傳統(tǒng)分布式系統(tǒng)解決方案的一種替代方案是實現(xiàn)偶爾連接的應用程序。偶爾連接的應用程序仍使得遠程工作人員能夠訪問數(shù)據(jù),但其所需的信息在本地存儲。偶爾連接的應用程序通常使用數(shù)據(jù)同步來填充本地數(shù)據(jù)庫。
數(shù)據(jù)同步包括以下功能:定期獲取存儲在一個數(shù)據(jù)庫(如客戶端數(shù)據(jù)庫)中的信息并與其他數(shù)據(jù)庫(如服務器數(shù)據(jù)庫)同步變更。基于同步的解決方案的優(yōu)點在于:用戶不再必須使用不間斷的網(wǎng)絡連接來訪問信息。由于將數(shù)據(jù)存儲在本地,用戶可以隨時訪問數(shù)據(jù),同時還減輕了中心數(shù)據(jù)庫的處理負載。此外,由于網(wǎng)絡速度不再是限制因素,用戶現(xiàn)在能夠以本地計算機的速度來訪問數(shù)據(jù)。
客戶端到客戶端同步可避免發(fā)生單點故障,因為它使同步不依賴于所有變更均需通過服務器。這種將大量應用程序處理推向每個客戶端的功能還有助于解決服務器可伸縮性問題。
是的,正如我們看到的,偶爾連接的應用程序非常適合解決因網(wǎng)絡問題不能一直保持連接的程序,并且能改善系統(tǒng)性能,增強可靠性。而我們需要做的就是,需要在本地數(shù)據(jù)庫和遠程數(shù)據(jù)庫中進行數(shù)據(jù)同步。Sync Framework就對數(shù)據(jù)庫同步這種場景提供了優(yōu)秀和完整的支持,使我們免于自己為每個系統(tǒng)去實現(xiàn)復雜的同步邏輯和異常處理。
Sync Framework 支持在數(shù)據(jù)庫之間進行同步。它提供了一個直觀且靈活的 API,使您可以生成面向脫機和協(xié)作方案的應用程序。通過該 API,您可以根據(jù)應用程序的體系結構和要求,使用所提供的所有或部分組件。Sync Framework 支持客戶端-服務器、客戶端到客戶端和混合拓撲。
Sync Framework 使用“同步提供程序(Synchronization Providers)”與同步的每個數(shù)據(jù)庫進行通信。Sync Framework 數(shù)據(jù)庫提供程序(與 ADO.NET 數(shù)據(jù)提供程序類似)保護其他 Sync Framework 組件不受各數(shù)據(jù)庫的特定實現(xiàn)方式的影響。Sync Framework 包括五個數(shù)據(jù)庫提供程序,這些提供程序支持兩種方案:脫機和協(xié)作方案。下圖顯示一個脫機方案:在客戶端-服務器拓撲中,多個客戶端連接到一個中央服務器,以便在連接可用時同步數(shù)據(jù)。

這種偶爾連接的應用程序的一個常見擴展是支持協(xié)作應用方案的能力。在協(xié)作方案中,兩個數(shù)據(jù)庫可以通過對等方式進行同步,而無需通過中央集線器。下圖顯示一個混合拓撲,其中,一個中央服務器與多個客戶端同步,并且這些客戶端能夠彼此同步。此類拓撲可以支持允許用戶共享項目備注的應用程序。項目團隊成員常常要求他們可處理的數(shù)據(jù)的本地副本。當他們進行變更時,他們可以與服務器同步以上載變更,或與其他團隊成員同步以交換變更。

數(shù)據(jù)庫同步提供程序
Sync Framework包含的3個主要的數(shù)據(jù)庫同步提供程序同時適用于脫機方案和協(xié)作方案,支持客戶端-服務器,客戶端-客戶端和混合拓撲。我們可以各種方式組合使用這些提供程序來對我們選擇的拓撲方案進行同步。因為Sync Framework元數(shù)據(jù)的使用,他們甚至可以和其他的Sync Framework提供程序進行同步。這3個同步提供程序如下:
SqlSyncProvider
- 對SQL Server、SQL Server Express、和SQL Azure databases進行同步。
- 提供豐富和可配置的準備工具來為數(shù)據(jù)庫建立必要的同步結構,比如元數(shù)據(jù)表和存儲過程。
- 包含了靈活的過濾選項用以對需要同步的表按行或列進行過濾,基于參數(shù)的過濾機制支持最大限度的重用數(shù)據(jù)庫元素。
- 提供了相應組件來幫助我們管理同步元數(shù)據(jù),包括清除元數(shù)據(jù)和恢復元素據(jù)(當我們從一個備份中恢復數(shù)據(jù)庫時)。
SqlCeSyncProvider
- 對SQL Server Compact databases進行同步
- 提供簡化的準備工具來為數(shù)據(jù)庫建立必要的同步結構,比如元數(shù)據(jù)表和存儲過程。
- 可以基于之前準備的SQL Server Compact database 快照高效的創(chuàng)建新的SQL Server Compact databases。
- 提供了相應組件來幫助我們管理同步元數(shù)據(jù)。
DbSyncProvider
- 通常用于同步ADO.NET兼容的非 SQL Server 數(shù)據(jù)庫。
- 提供了功能完備的API以允許任何ADO.NET兼容的數(shù)據(jù)庫來進行同步工作。
Offline-Only Providers
另外兩個數(shù)據(jù)庫同步提供程序只支持脫機方案。這些提供程序已經(jīng)被上述同時支持脫機方案和協(xié)作方案的提供程序取代。所以對于新開發(fā)的應用程序,請使用上面介紹的提供程序。脫機方案提供程序包括:DbServerSyncProvider、SqlCeClientSyncProvider 。
這兩個提供程序具備如下特征:
- 適合于客戶端-服務器拓撲。
- 總是成對使用。例如,您不能通過使用 ServerSyncProvider 的兩個實例同步兩個服務器數(shù)據(jù)庫(改為使用 SqlSyncProvider 或 DbSyncProvider)。
- 可能沒有協(xié)作提供程序復雜,但無法與其他 Sync Framework 提供程序一起參與拓撲。
數(shù)據(jù)庫同步的體系結構和類
數(shù)據(jù)庫同步體系結構
在脫機和協(xié)作方案中,Sync Framework可以用在兩層和N層架構中。在任何一種架構中,下面的活動發(fā)生在一個同步會話中:一個synchronization orchestrator與兩個同步提供程序進行通訊來對數(shù)據(jù)庫進行獲取和應用變更。同步提供程序使用包含了相關SQL Commands的同步適配器(synchronization adapter)來為每個表進行同步。一些提供程序公開這些適配器以允許我們對這些SQL命令進行定制,另外一些提供程序則自動生成適配器來降低同步工作的復雜度。
下圖顯示了一個兩層架構:一個同步會話中的所有組件都位于本地計算機,包含一個直接連接遠程數(shù)據(jù)庫的連接。在同步會話中,本地計算機是指發(fā)起同步的計算機。如果我們希望對多個計算機進行同步,每個計算機都必須包含圖中所示的所有組件。

下圖顯示了一個N層架構:這種架構需要額外的組件,包括遠程計算機中的組件和service,本地計算機上的proxy(代理)將會處理到遠程數(shù)據(jù)庫的連接。開發(fā)人員必須自己實現(xiàn)proxy和service。

參與同步的數(shù)據(jù)庫可以是SQL Server 2005 SP2或之后的任意版本,包括SQL Server Compact 3.5 SP2及以后版本、SQL Azure、或提供了ADO.NET提供程序的其他數(shù)據(jù)庫。Sync Framework為SQL Server和SQL Server Compact databases自動配置了變更跟蹤和元數(shù)據(jù)存儲。
Sync Framework類
SyncOrchestrator(同步代理)
同步代理通過以下方式驅動同步過程:
- 基于Direction屬性來決定應用改變的順序和方向。
- 調用服務器同步提供程序以對服務器數(shù)據(jù)庫進行檢索和應用變更。
- 調用客戶端同步提供程序以對客戶端數(shù)據(jù)庫進行檢索和應用變更。
此外,同步代理還維護同步操作的會話級別信息,并向客戶端上的應用程序提供成功消息、錯誤和統(tǒng)計信息。
SyncProvider (SqlSyncProvider, SqlCeSyncProvider, 和DbSyncProvider)
同步提供程序與相應的數(shù)據(jù)庫進行通信,并將同步代理和數(shù)據(jù)庫的特定實現(xiàn)屏蔽開來。對于SQL Server Compact databases ,使用SqlCeSyncProvider;而對于其他版本的SQL Server,包括SQL Azure,使用SqlSyncProvider;對于非SQL數(shù)據(jù)庫使用DbSyncProvider。這3種Providers都繼承自RelationalSyncProvider。同步提供程序的主要活動如下所示:
- 檢索自上次同步以來在(本地)數(shù)據(jù)庫中發(fā)生的變更。
- 對(遠程)數(shù)據(jù)庫應用增量變更。
- 檢測發(fā)生沖突的變更。
SyncAdapter (DbSyncAdapter和SqlCeSyncAdapter)
同步適配器模仿 ADO.NET 中的數(shù)據(jù)適配器,并為進行同步的每個表定義同步適配器。同步適配器為同步提供程序提供了與數(shù)據(jù)庫交互所需的特定SQL命令。
對于SqlSyncProvider和SqlCeSyncProvider使用的同步適配器,Sync Framework會自動生成相關SQL命令,這樣可以降低同步的復雜度。對于DbSyncAdapter,我們需要自己來創(chuàng)建適配器和指定相關SQL命令,例如 InsertCommand,此命令可從客戶端數(shù)據(jù)庫向服務器數(shù)據(jù)庫應用插入。由于同步適配器使用 ADO.NET DbCommand 對象,因此可以使用 ADO.NET 支持的任意命令結構。這包括內聯(lián) Transact-SQL、存儲過程、視圖、函數(shù)等。這些命令只需要定義了要傳輸和應用的結構和數(shù)據(jù)的單個結果。
API中的其他類
上圖展示了 API 中主要的類。但是,還有許多類沒有在圖中展示出來。若要獲取有關所有可用類的信息,可以參見 Microsoft.Synchronization、Microsoft.Synchronization.Data、Microsoft.Synchronization.Data.SqlServerCe 和 Microsoft.Synchronization.Data.Server這是個dll中詳細的API定義。以下部分介紹了您應該熟悉的其他重要的類。
DbSyncScope(同步作用域)
同步作用域是對進行同步的對象的一種邏輯分組。對于數(shù)據(jù)庫同步,一個同步組通常是一組數(shù)據(jù)表,并且數(shù)據(jù)表可以被過濾。同時一個數(shù)據(jù)表可以被包含在一個或多個同步組中。
Database Provisioning Objects(數(shù)據(jù)庫準備對象)
對于SQL Server和SQL Server Compact databases,Sync Framework提供了一組類用來描述同步組和每個同步組中包含哪些數(shù)據(jù)表。在這些表和同步組被定義后,我們就可以使用Sync Framework對象來對每個節(jié)點應用準備腳本(provisioning scripts)。這些腳本創(chuàng)建了一個變更跟蹤和變更應用的基礎架構,包含了metadata tables, triggers, 和stored procedures。下表列出了用來準備數(shù)據(jù)庫和提供程序的相關類:
|
SQL Server、SQL Azure |
SQL Server Compact |
Description |
|
DbSyncScopeDescription |
DbSyncScopeDescription |
表示同步作用域,同步作用域是作為一個單元同步的表(可篩選)的邏輯分組。 |
|
SqlSyncScopeProvisioning |
SqlCeSyncScopeProvisioning |
表示用于特定作用域的 SQL Server、SQL Azure 或 SQL Server Compact 數(shù)據(jù)庫的設置 |
|
SqlSyncProviderScopeConfiguration |
SqlCeSyncProviderScopeConfiguration |
表示針對特定作用域的 SqlSyncProvider 或 SqlCeSyncProvider 使用的配置信息。 |
|
DbSyncTableDescription |
DbSyncTableDescription |
表示在同步作用域中包括的表的架構。 |
|
DbSyncColumnDescription |
DbSyncColumnDescription |
表示屬于在同步作用域中包括的表的列的架構。 |
|
SqlSyncDescriptionBuilder |
SqlCeSyncDescriptionBuilder |
表示同步中涉及的 SQL Server、SQL Azure 或 SQL Server Compact 數(shù)據(jù)庫的作用域和表信息。 |
|
SqlSyncTableProvisioning |
SqlSyncTableProvisioning |
表示由DbSyncTableDescription 對象表示的SQL Server, SQL Azure, 或SQL Server Compact database設置。 |
|
SqlSyncProviderAdapterConfiguration |
SqlSyncProviderAdapterConfiguration |
表示某個數(shù)據(jù)庫表的同步適配器配置信息 |
SyncOperationStatistics
會話統(tǒng)計信息是同步代理為每個同步會話提供的一組統(tǒng)計信息。統(tǒng)計信息包括與同步時間、所處理的變更數(shù)量以及所發(fā)生的任何沖突或異常有關的信息。
DbSyncSession
DbSyncSession對象提供了對同步會話變量的訪問。會話變量是一些為開發(fā)人員提供的變量,用作在服務器上執(zhí)行的選擇、插入、更新和刪除命令的參數(shù)。
Sync Framework DLLs
Sync Framework中的數(shù)據(jù)庫同步類包含在如下這些DLLs中:
Microsoft.Synchronization.dll,包含了SyncOrchestrator。
Microsoft.Synchronization.SqlServer.dll,包含了SqlSyncProvider。
Microsoft.Synchronization.SqlServerCe.dll,包含了SqlCeSyncProvider。
Microsoft.Synchronization.Data.dll,包含了RelationalSyncProvider, DbSyncProvider 和DbSyncAdapter。
本篇講述了數(shù)據(jù)庫同步的背景和優(yōu)勢以及具體的數(shù)據(jù)庫同步提供程序,也講述了其體系結構和重要的同步類,下一篇我們將通過一個完整的實例來展示如何使用這些提供程序和相關類來完成我們的同步任務。

浙公網(wǎng)安備 33010602011771號