MobiLink开发资源集之数据分区第一部分

来源:岁月联盟 编辑:zhuzhu 时间:2007-08-03

步骤清单:

 

上一部分,我们了解了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.dbdbeng9 remote.dbdbisql:Remote:CREATE PUBLICATION Lab_03(TABLE emp)CREATE SYNCHRONIZATION USER "0002"CREATE SYNCHRONIZATION SUBSCRIPTION TO Lab_03FOR "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 = ?');COMMITcmd:dbmluser -c "dsn=center" -u 0002 -p abcdefgdbmlsrv9 -dl -v+ -x tcpip -c "dsn=center" -o mlserver.mlsdbmlsync -c "dsn=remote" -o dbmlsync.out -v -u 0002 -mp abcdefg -e "sv=demo3"