步驟清單:
上一部分,我們了解了MobiLink的大致工作機理,並且介紹了一些事件和事件內的腳本。上一部分中,有一個腳本是這樣的:
CALL ml_add_table_script('demo2', 'emp', 'download_cursor', 'SELECT * FROM emp WHERE deptno=''0001''');
它是為版本為demo2的腳本建立了一個對emp表下載時的命令,要求之下載符合deptno = '0001'的數據。但是我們來想象一個情況,我們往往都是喜歡靈活的一些SQL。例如,不同部門的人下載不同的數據,而且可能要求下載或者上傳自上次同步以來的數據,即增量同步。這兩種需求都可以通過我們的數據分區來實現。也就是說,我們把數據中心的數據按照一定的規則劃分,每次只下載/上傳部分數據。
在這一部分,我們先看如何將數據分區的第一部分:根據用戶分區數據。
在很多事件裡,尤其是表事件,都會有一個事件參數,叫ml_username。它是一個VARCHAR(128)的變量,MobiLink的用戶名會傳入該事件中,我們即可使用該變量以達到數據分區的效果。我們來看一個例子,例如download_cursor表事件,裡面有兩個事件參數,第一個是 last_download,TIMESTAMP數據類型;第二個參數是ml_username,VARCHAR(128)數據類型。這兩個參數都可以在事件腳本中用?代替。同步時,MobiLink會將參數一一傳送給?。所以,第一個?接收第一個參數,第二個?接收第二個參數。參看這個語句:
CALL ml_add_table_script( 'demo3', 'emp', 'download_cursor', 'SELECT * FROM emp WHERE ? IS NOT NULL AND deptno = ?');
其中,?IS NOT NULL中的?是用來接收last_download這個參數的,所以這個?在這裡只是占位符,沒有實際意義;第二個問號,也就是deptno = ?是用來接收ml_username的。所以,在以上語句中,download_cursor僅會讓deptno符合ml_username的數據下載。其他很多事件中都有這個參數。具體參考《MobiLink 同步技術用戶指南》。
所以,在此之前,你可以建立一個用戶,叫:
0002:CREATE SYNCHRONIZATION USER "0002"
然後將該用戶添加至MobiLink服務器端:dbmluser -c "dsn=center" -u 0002 -p abcdefg
在同步的時候,MobiLink服務器端不要開啟-zu+開關,客戶端觸發同步時,分別用-u和-mp參數指定用戶名和口令:
dbmlsync -c "dsn=remote" -o dbmlsync.out -v -u 0002 -mp abcdefg -e "sv=demo3"。
這樣,我們只需要建立不同的同步用戶,讓不同的人使用不同的用戶名/口令登錄,就能夠達到數據分區的效果。在整個MobiLink的同步事件中,很多事件都會將ml_username作為傳入參數,使用該參數的方法與本部分內容一致。
具體內容請參看《MobiLink同步參考》。
這個部分的腳本如下:
cmd: dbeng9 center.db dbeng9 remote.db dbisql: Remote: CREATE PUBLICATION Lab_03 ( TABLE emp ) CREATE SYNCHRONIZATION USER "0002" CREATE SYNCHRONIZATION SUBSCRIPTION TO Lab_03 FOR "0002" TYPE 'TCPIP' ADDRESS 'host=localhost;port=2439' OPTION ScriptVersion = 'demo3' center: CALL ml_add_table_script( 'demo3', 'emp', 'download_cursor', 'SELECT * FROM emp WHERE ? IS NOT NULL AND deptno = ?'); COMMIT cmd: dbmluser -c "dsn=center" -u 0002 -p abcdefg dbmlsrv9 -dl -v+ -x tcpip -c "dsn=center" -o mlserver.mls dbmlsync -c "dsn=remote" -o dbmlsync.out -v -u 0002 -mp abcdefg -e "sv=demo3"