程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase綜合文章 >> MobiLink開發資源集之數據分區第一部分

MobiLink開發資源集之數據分區第一部分

編輯:SyBase綜合文章

步驟清單:

 

上一部分,我們了解了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"
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved