MobiLink开发资源集之MobiLink脚本综述

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

步骤清单:

 

在上一议题中,我们演示了一个最简单的数据同步情景。由此,我们有几点总结:

 

MobiLink 由服务器端(dbmlsrv9)和客户端(dbmlsync)组成。服务器端与数据中心连接,客户端与远程数据库连接。其中,数据中心可以是任何符合 ODBC标准的数据源,例如Oracle、IBM DB2、MS SQLServer与Sybase ASE等。

 

MobiLink在同步的过程中首先将远程数据库的数据上载,接着将数据中心的数据下载,以此完成一次同步。

 

在非常简单的情况下,不需要编写任何脚本。

 

但是情况总是会变化的。我们可能有特殊要求。例如,我们只需要某一个部门的数据,我们不想把所有的更改都上传到服务器上……那么,通过什么来指挥MobiLink上载或者下发哪些数据呢?就通过在统一服务器端编写的MobiLink的事件和事件中的脚本来控制。

 

首先,MobiLink的事件分为两大类, 第一大类是连接事件,这类事件在全局范围内指挥MobiLink的行为。第二类事件是表事件,这类事件在某表的范围内指挥MobiLink的行为。MobiLink在不同的阶段触发这些事件,书写在这些事件里面的脚本就能指挥MobiLink的行为。

连接事件:

 

begin_connection:连接统一数据库后调用begin_synchronization:在远程连接后,执行任何数据改变前调用 (参数:ml_username)begin_upload:在将远程数据库的更改执行到统一数据库之前调用。它是upload事务的一部分(参数:ml_username)end_upload:在将远程数据库的更改执行完成后调用。upload(上载)阶段随之提交(参数:ml_username)begin_download:在将数据从统一数据库抽取出来送至远程数据库前调用。它是下载事务的一部分(参数:last_download, ml_username)end_download:在远程数据库实施改变后调用。下载事务随之提交(参数:last_download, ml_username)end_synchronization:在执行完改变后与远程断开连接前调用(参数:ml_username)end_connection:在与统一数据库断开连接前调用

 

 

 

两个特殊的连接事件:

 

handle_error:错误处理report_error:报告错误

 

 

 

 

表事件:

 

begin_upload:在远程每张表执行上载到统一数据库之前调用。(参数:ml_username, table)upload_insert:对每一行将送至统一数据库的插入调用。(参数:col1, col2, col3...)upload_update:对每一行将送至统一数据库的更新调用。(参数:SET col1, col2, ..., colN WHERE pk1, pk2, ..., pkN)upload_delete:对每一行将送至统一数据库的删除调用。(参数:pk1, pk2, ..., pkN)end_upload:在将远程表的更改执行至统一数据库后调用。(参数:ml_username, table)begin_download:在统一数据库将每张表的数据下载前调用。(参数:last_download, ml_username, table)download_cursor:每张表调用一次,将统一数据库的表数据下载至远程数据库。(参数:last_download, ml_username)end_download:在统一数据库将每张表的数据下载后调用。(参数:last_download, ml_username, table)

 

 

 

需要注意的是,在连接事件和表事件中有一些重复的事件,例如begin_upload,不过它们作用的级别不一样,触发的时间也不一样。对于所有的连接事件,我们都用调用ml_add_connection_script存储过程来实现其中的脚本;对于所有的表事件,我们都通过调用ml_add_table_script存储过程来实现其中的脚本。

 

例如:

 

call ml_add_connection_script('Lab', 'begin_download', 'CALL InitiateDownload()'),

 

第一个参数是代表脚本版本,第二个参数指明连接事件的名称,第三个参数指定连接事件触发时的逻辑,在这里是调用一个存储过程。再看一个表事件的例子:

 

call ml_add_table_script('demo2', 'emp', 'download_cursor', 'SELECT * FROM emp WHERE deptno=''0001'''),

 

第一个参数代表脚本版本,第二个参数指明该事件跟哪个事件相关,第三个参数指明事件的名称,第四个参数是事件触发时执行的语句。在这里,我们指定服务器只将emp中满足deptno='0001'的数据下载至远程。

 

upload_delete、upload_update和upload_insert里面的参数都是通过?占位符表示的。详细信息,请参看《MobiLink 同步技术用户指南》。

 

在本部分的屏幕录像中,我们仅使用了针对emp表的update_delete和download_cursor两个事件来指挥只有部门号为0001的数据能下载到远程数据库中,并且在远程数据库中做的删除动作能反映到中心数据库。在服务器启动的过程中去掉了-za+选项,让服务器不要自动生成脚本,去掉了-zu+的选项,通过dbmluser来添加用户,形成真实的用户验证。并且在同步dbmlsync触发同步的过程中,我们去掉了SendColumnNames=ON的扩展选项,因为我们在服务器端已经定义了同步脚本。

 

以下是屏幕录像中的全部脚本:

 

将在上一议题的Demo中备份的数据库文件拷贝过到新的文件夹下,在命令行中分别启动中心与远程数据库:

 

dbeng9 center.dbdbeng9 remote.dbdbisql

对于remote:

 

CREATE PUBLICATION Lab_02(TABLE emp)CREATE SYNCHRONIZATION USER "Sales02"CREATE SYNCHRONIZATION SUBSCRIPTION TO Lab_02FOR "Sales02"TYPE 'TCPIP'ADDRESS 'host=localhost;port=2439'OPTION ScriptVersion='demo2'

 

 

对center:

 

CALL ml_add_table_script('demo2', 'emp', 'upload_delete', 'DELETE emp WHERE empno=?');CALL ml_add_table_script('demo2', 'emp', 'download_cursor', 'SELECT * FROM emp WHERE deptno=''0001''');

 

 

 

在控制台下:

 

dbmluser -c "dsn=center" -u Sales02 -p abcdefgdbmlsrv9 -dl -v+ -x tcpip -c "dsn=center" -o mlserver.mlsdbmlsync -c "dsn=remote" -o dbmlsync.out -v -u Sales02 -mp abcdefg -e "sv=demo2"

 

其中,sv是ScriptVersion的简写。