步驟清單:
在上一部分中,我們看見在download_cursor表事件中有兩個參數,其中我們使用了ml_username這個參數。那麼, last_download這個參數是怎麼使用的呢?我們注意到,last_download這個參數是TIMESTAMP類型的。它指明了上一次下載的時間。我們可以通過比較時間戳,來達到每次僅同步下載自上次下載以來更改過的數據。在下載階段緊前面的最後一次成功的同步過程中,從統一數據庫中獲取的時間值即為 last_download 時間戳。如果當前用戶從未成功地進行過同步,則該值將被設置為 1900-01-01。下圖展示了MobiLink服務器與客戶端在首次交互前後last_modifIEd的變化情況:
在真正實施比較之前,我們需要在統一數據庫一側做一些改動,也就是在一些表上增加一個時間戳的字段。比如,我們在錄像中對統一數據庫實施了以下語句:
ALTER TABLE emp ADD last_modifIEd TIMESTAMP NOT NULL DEFAULT TIMESTAMP
Oracle的映射數據類型為date
IBM DB2的映射數據類型為timestamp
MS SQL Server的映射數據類型為datetime
Sybase ASE的映射數據類型為datetime
時間戳方法是可以進行高效的同步的最實用的通用技術。此項技術涉及跟蹤每個用戶上次進行同步的時間,並使用此信息控制下載到每個遠程數據庫的行。
MobiLink 保留了一個用以說明每個 MobiLink 用戶上一次下載數據的時間戳值。該值被稱為上次下載的時間戳。上次下載的時間戳將作為一個參數被提供給許多事件,該時間戳還可以在同步腳本中使用。
如果您正在使用 Adaptive Server Anywhere 統一數據庫,而且保存上次修改信息的列的類型為 DEFAULT TIMESTAMP,則不應同步該列。如果您的遠程數據庫需要這樣的列,應使用不同的列名。否則,時間戳的缺省值可能被上載值覆蓋,並不會包含上次在統一數據庫中修改該行的時間。當我們在統一數據庫中的表中增加了時間戳後,就可以在download_cursor中編寫如下的腳本:
CALL ml_add_table_script( 'demo4', 'emp', 'download_cursor', 'SELECT empno, empname, gender, deptno FROM emp WHERE last_modifIEd > ?')
所以,上述download_cursor的腳本中將只下載自上次同步後更改的數據。
本部分的代碼如下:
center: ALTER TABLE emp ADD last_modified TIMESTAMP NOT NULL DEFAULT TIMESTAMP Remote: CREATE PUBLICATION Lab_04 ( TABLE emp(empno, empname, gender, deptno) ) CREATE SYNCHRONIZATION USER "Sales04" CREATE SYNCHRONIZATION SUBSCRIPTION TO Lab_04 FOR "Sales04" TYPE 'TCPIP' ADDRESS 'host=localhost;port=2439' OPTION ScriptVersion = 'demo4' Center: CALL ml_add_table_script( 'demo4', 'emp', 'download_cursor', 'SELECT empno, empname, gender, deptno FROM emp WHERE last_modifIEd > ?') COMMIT cmd: dbmlsrv9 -dl -v+ -x tcpip -c "dsn=center" -o mlserver.mls -zu+ dbmlsync -o dbmlsync.out -v -e "sv=demo4" -c "dsn=remote"