分布式數據挑戰
彼此沒有固定聯系的分布式數據庫無法提供任何全系統鎖定的機制。特別是沒有任何機制可阻止您插入在兩個不同遠程數據庫中具有相同主鍵的兩行,從而在將這些行上傳到統一數據庫時造成主鍵沖突。
解決方案之一是使用由一個普通自動增量列加上數據庫標識符組成的復合主鍵來解決不同數據庫的自動增量值重疊問題。多列主鍵使外鍵定義過於復雜,令應用程序開發人員非常頭疼,因此全局惟一標識符(GUID)有時被視為單列替代方案。GUID是具有形如“6F9619FF-8B86-D011-B42D-00C04FC964FF”的128位整型;具有惟一性,但會導致繁冗的數據庫索引,同時這些值在調試時很難處理。而另一個解決方案是使用鍵池,中心服務器在鍵池處生成和下載唯一鍵值組,供單個遠程數據庫隨後使用。鍵池確實是一種可行方案,但合理地實現和管理都非常困難,特別在多級層次結構上更是如此。另外,它們還會造成額外的網絡流量。
ASA為全局惟一主鍵問題提供了一種更好的解決方案:通過GLOBAL AUTOINCREMENT列默認值提供的分區自動增量工具。為各數據庫分配以唯一的數據庫標識符:1﹑2﹑3等等,並且自動使用該值確定值的哪個分區或范圍用於分配數據庫的主鍵值。
這對 Mobile Inspector 應用程序非常重要,因為每個遠程數據庫的許多表都要頻繁插入新行,而且它們都有自動分配或人工分配的主鍵。如下實例展示了用於在BLOB列中保存手繪草圖的 BRI_SKTCH表。分區尺寸設定為2,000,000,也就是說每位檢查員都能創建很多草圖直至分區用盡。32位的有符號整型主鍵最大可達2,147,483,647;2,147,483,647除以2,000,000等於1,073,1,073是應用此機制而不產生主鍵沖突的數據庫最大數量。32位的由符號整型用於Mobile Inspector程序;對於其他更大的應用程序,可使用64位無符號整型。
CREATE TABLE BRI_SKTCH ( SKTCH_ID INTEGER NOT NULL DEFAULT GLOBAL AUTOINCREMENT ( 2000000 ), STRCTR_ID INTEGER NOT NULL, SKTCH_TTL VARCHAR ( 45 ) NOT NULL, SKTCH_DES VARCHAR ( 130 ) NULL, FILE_NM VARCHAR ( 32 ) NULL, DEL_FLG_IND BIT NOT NULL DEFAULT 0, LST_MDFD_TS TIMESTAMP NOT NULL DEFAULT TIMESTAMP, SKTCH_LOB LONG BINARY NULL, SKTCH_NBR INTEGER NOT NULL, SKTCH_SZ_AMT INTEGER NULL, PRIMARY KEY ( SKTCH_ID ) );
分布式數據的另一挑戰就是降低同步過程所需的網絡流量。專業同步軟件出現前,必須編寫應用程序代碼來確定需要來回傳送的數據。有時這些代碼會傳輸過多數據以確保不遺漏任何數據。其他時候,傳輸時間剛好和它搜索需要調整的差別一樣長。
MobiLink客戶端讀取遠程數據庫事務日志來確定必須上傳的數據,從而降低了網絡流量。只有在上次同步之後插入﹑更新或刪除的行才會被發送。另外,假如在兩次同步之間,行進行過多次修改,則僅上傳最終版本。
當建立下載流時,MobiLink服務器不具備相同的優勢。因為它與不同的數據庫協同工作,比如Oracle﹑SQL Server和DB2,MobiLink不能訪問事務日志。假如您不想每次都下載完整的表,您必須在download_cursor 腳本中編寫適當的WHERE子句。
此時即可利用另外一項ASA的特性:用特殊的DEFAULT TIMESTAMP屬性定義的時間戳列將在每次更新及插入行時自動更新。先前的CREATE TABLE展示了如何使每個表擁有LST_MDFD_TS 列,該列能保持最新而無需編寫觸發器。之前的SELECT語句包含 LST_MDFD_TS >= ?謂詞,該謂詞使下載結果集限於自上次同步後發生變化的那些行。MobiLink 服務器自動將占位符“?”替換為上次同步時間戳的值,因此不必編寫任何自定義代碼來跟蹤各遠程數據庫同步的時間。
結束語
離開北卡羅萊納州後,我開始注意路邊的工作人員,好奇他們是否正在做檢查工作。也許將來的某一天,我能通過他們是否使用移動電腦找到答案。最後一批平板電腦已抵達NC DOT,這是成本關注領域真正的成功標志。假如像Mobile Inspector 這樣的應用程序適用於這個領域,則適用於一切環境。
在Mobile Inspector 應用程序方面的工作經歷鞏固了我近年來學到的兩個經驗:首先,很容易低估同步設置的復雜性,特別是當它是大型業務應用程序的主要部分時更是如此。其次,關系型數據庫數據級的同步簡化了設置,因為它把同步邏輯和應用程序代碼分開處理,把復雜的數據結構還原到簡單的行與列,並利用了像事務提交和列默認值等數據庫基本特性。