实例介绍一个相对复杂的MobiLink例子

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

具体步骤:

1.需要两个ASA的数据库。在命令行方式下,分别键入

 

dbinit con1.db dbinit rem1.db

 

 

 

 

con1这个数据库代表中心数据库,rem1代表远程数据库,我们把中心数据库的数据通过MobiLink同步到rem1来。

 

2.中心数据库里面需要数据

 

在dbisql下,连接con1数据库(连接方法不会发帖子问啊,或者下载文档看)

 

输入命令:

 

对con1建表:

 

CREATE TABLE dept ( deptno CHAR(4) NOT NULL PRIMARY KEY, deptname VARCHAR(10) NOT NULL ); CREATE TABLE employee ( empno CHAR(5) NOT NULL PRIMARY KEY, empname VARCHAR(20) NOT NULL, deptno CHAR(4) NOT NULL, FOREIGN KEY (deptno) REFERENCES dept(deptno) );

 

 

 

对con1添加数据:

 

INSERT INTO dept VALUES('0001', 'admin'); INSERT INTO dept VALUES('0002', 'finance'); INSERT INTO dept VALUES('0003', 'sales'); INSERT INTO dept VALUES('0004', 'presales'); INSERT INTO dept VALUES('0005', 'marketing'); INSERT INTO dept VALUES('0006', 'CS&S'); INSERT INTO dept VALUES('0007', 'ADO'); COMMIT; INSERT INTO employee VALUES('31274', 'Johnson Zhang', '0005'); COMMIT;

 

 

 

 

OK。然后再连接上rem1数据库,也要建表,但是不要数据:

 

CREATE TABLE employee ( empno CHAR(5) NOT NULL PRIMARY KEY, empname VARCHAR(20) NOT NULL, deptno CHAR(4) NOT NULL, );

 

 

我们要做的是一个双向同步的例子,也就是说con1和rem1的数据更改在同步后都会在两端保持一致。

 

2.ODBC管理器

分别建立对两个数据库的ODBC连接,名为“cons”和“rem1”。

 

3.在dbisql下,连接到rem1数据库,并建立发布

 

CREATE PUBLICATION demo1 ( TABLE employee );

 

a. 发布的含义是什么呢?大家灌水回答问题,获赠图书!

 

b. 如果我还想发布其他的表怎么办呢?

 

c. 如果我只想发布employee表中的前两列,并且是empno大于40000的数据怎么办呢?

 

答案可以在《MobiLink 服务器启动同步用户指南》中寻找。

 

 

4.创建同步用户

 

在dbisql下,CREATE SYNCHRONIZATION USER "51";

 

 

 

 

5.建立订阅

 

 

 

在dbisql下, CREATE SYNCHRONIZATION SUBSCRIPTION  TO "demo1" FOR "51" TYPE 'TCPIP' ADDRESS 'host=localhost;port=2439' OPTION ScriptVersion='demo1';

 

 

6.三件事情

 

a. 搭建了中心数据库(con1)。包含建立ODBC

b. 搭建了远程数据库(rem1)。包含建立ODBC

c. 在远程数据库上定义发布、同步用户和订阅

 

因为MobiLink可支持ASA/UltraLite(远程端)和任何符合ODBC标准的数据源同步,所以要建立ODBC。当然,ASA 10(还没有发布呢)可以支持跟任何数据源的同步(XML、EXCEL、文本文件等)。

 

定义的发布指的是我们标定远程数据库的哪些表及其这些对这些表的相关投影和选择后的数据是需要同步的。

 

订阅可以让中心服务器与远程数据库的数据按照定义的订阅规则交互。

 

MobiLink是先做上载的,也就是说先把远程的数据上载到服务器端,当然你也可以不做上载。

MobiLink在做完上载后做下载,也就是把服务器端的数据下载到远程数据库上,这样就保持了con1和rem1两个数据库的一致。

 

另外,MobiLink在做上载的时候是做仅更改的数据,也就是做增量上载,做下载的时候需要一些技巧来完成增量下载,本次主题不讨论这个问题。

 

 

对于上载和下载来说,都是通过一些在中心数据库的事件来实现的。这些典型的事件包括:

 

upload_insert事件

upload_update事件

upload_delete事件

 

download_cursor事件

等等。

 

在这里我们仅介绍这几个事件。

 

对于upload开头的,肯定都是上载事件了。当远程服务器(rem1)和中心服务器(con1)通过MobiLink连接的时候,也就是MobiLink客户端与MobiLink服务器连接了之后,MobiLink客户端根据发布定义创建上载流。

 

如果在同步与同步期间,符合发布定义的数据有了改变,这些改变后的数据就会包含在上载流中。上载流通过MobiLink到达中心服务器,进而通过upload_insert, upload_update和upload_delete事件控制这些数据的走向。

 

比如,在这个例子中,我们可以在dbisql下,分别应用ml_add_table_script存储过程来完成对三个事件的定义:

 

call ml_add_table_script( 'demo1', 'employee', 'upload_insert','INSERT INTO employee( empno, empname, deptno) VALUES (?, ?, ?)') call ml_add_table_script('demo1', 'employee', 'upload_update', 'UPDATE employee SET deptno=?, empname=? WHERE empno=?') call ml_add_table_script('demo1', 'employee', 'upload_delete', 'DELETE employee WHERE empno=?')

 

 

 

这样的话,上载上来的数据就可以按照这三个事件的要求进入中心数据库了。当然,你可以根据自己的要求改变这三个事件中的SQL语句。demo1作为版本编号来讲非常重要,他要与客户端的订阅中的版本号一致。

 

然后,上载完成了。MobiLink服务器就会根据download_cursor事件的要求来组织下载,下载的数据传到MobiLink客户端后会应用到远程数据库。

 

call ml_add_table_script('demo1', 'employee', 'download_cursor', 'SELECT empno, empname, deptno FROM employee')

 

 

 

这条语句定义了download_cursor事件,这个事件中的结果集将下载并应用到远程数据库。

 

所以,这样的话,整个同步的搭建工作就差不多了,接下来,我们就启动同步服务器并触发同步。

 

7.启动同步服务器

 

在cmd下

 

dbmlsrv9 -dl –v+ –zu+ -x tcpip -c "DSN=cons" –ot ml.txt

这样,MobiLink服务器就启动了,同时也不像简单的那个例子一样,它不支持自动生成脚本,因为脚本我们已经定义了。本命令在con1所在的计算机上执行。

 

触发同步:

在cmd下

 

DBMLSync –c "dsn=rem1" –v –dl  –o rem1.txt

 

本命令在rem1所在计算机上执行。这样的话呢,我们就从客户端触发了一次同步,对数据进行了同步。

在同步完成后,可以关闭DBMLSync所开启的窗口,把中心和远程的数据都更改一下,再次DBMLSync。