MobiLink开发资源集之简单的数据同步

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

步骤清单:

 

 

相信大家都看过了这个屏幕录像,大概能明白MobiLink是做什么的了,简单说,MobiLink是做数据同步的。

MobiLink 同步允许在符合 ODBC 标准的统一数据库和 Adaptive Server Anywhere 或 UltraLite 远程数据库之间进行复制。在本教程中使用的是 Adaptive Server Anywhere 远程数据库。统一数据库可以是使用 Sybase Adaptive Server Anywhere、Sybase Adaptive Server Enterprise、Oracle、Microsoft SQL Server 或 IBM DB2 生成的数据库。

 

MobiLink 适用于将一个统一数据服务器与大量远程数据库进行同步(通常包含多个移动数据库)。远程站点的管理和资源要求已降到了最低限度。此系统是基于连接的,并且远程站点可随时进行连接。在每次进行连接之后,数据库是完全同步的。

 

MobiLink 的工作方式是:将远程数据库上的多个事务的结果合并成一个更改集,然后应用到统一数据库中。因为同步始终在事务边界进行的,所以保持了参照完整性。不保留在组件事务过程中所做的各个更改的顺序:因为从不复制未提交的数据,所以保留了数据完整性。

 

从体系结构上说,MobiLink分为服务器端和客户端两部分。MobiLink服务器与统一数据库连接(ASA、ASE、SQL Server、Oracle...),MobiLink客户端则与远程数据库连接(ASA或UltraLite)。

 

进行同步时,当 MobiLink 远程站点打开与 MobiLink 同步服务器的连接时,通常便开始了同步过程。同步期间,远程站点的 MobiLink 客户端将上载自上一次同步以来对远程数据库所作的更改。MobiLink 同步服务器在收到这些数据时开始更新统一数据库,然后将统一数据库中的更改下载到远程数据库。

 

所以,我们需要在远程数据库上建立发布,CREATE PUBLICATION,告诉MobiLink Client,这些表的这些列是需要同步的。例如:

 

CREATE PUBLICATION Lab_all(TABLE dept,TABLE emp)

以上语句表明,Lab_all这个发布将会让MobiLink客户端在同步时组织dept表和emp表的上载流数据。目前是组织两个表中的自上一次修改以来变化的所有数据作为上载流,当然,也可以通过在发布上加列,加条件完成。例如:

 

CREATE PUBLICATION pub_customer ( TABLE customer ( id, company_name, city, state ) WHERE status = 'active' )。

 

 

 

当然,我们也需要在远程数据库上建立同步用户:

 

CREATE SYNCHRONIZATION USER "SIMPLE"

接下来,就建立一个SYNCHRONIZATION SUBSCRIPTION。这是为MobiLink用户定义预定发布。预定发布将告诉MobiLink客户端,在同步时,这个用户和其对应的发布将使用什么样的方式连接到MobiLink服务器,并使用MobiLink服务器端指定版本的同步脚本来进行同步。例如:

 

CREATE SYNCHRONIZATION SUBSCRIPTION TO Lab_allFOR "SIMPLE"TYPE 'TCPIP'ADDRESS 'host=localhost;port=2439'OPTION ScriptVersion='Lab01'

 

这就是说,SIMPLE这个用户,在MobiLink客户端将使用Lab_all这个发布把数据进行上/下载。他使用TCPIP协议,通过与 localhost 2439端口通信连接上MobiLink服务器,并且在同步过程中使用MobiLink服务器端版本号为Lab01的同步脚本。

 

然后,作为最简单的例子,我们启动同步服务器:

 

dbmlsrv9 -c "dsn=center" -x tcpip -o mlserver.mls -v+ -dl -za -zu+

他将不进行用户验证(-zu+),也会自动生成同步脚本(-za)(因为在前面的步骤中我们没有建立同步脚本)。当然,MobiLink Server也将连接到中心数据库center。其他几个选项都是用于日志什么的。

 

启动同步服务器后,可以在同步客户端上触发同步:

 

dbmlsync -c "dsn=remote" -o dbmlsync.out -v -e "SendColumnNames=ON"

当MobiLink服务器端未建立同步脚本时,需要指定SendColumnNames=ON,以便让MobiLink客户端发送列名,以便MobiLink服务器端自动生成同步脚本。其他选项用于日志、连接远程数据库等。

 

在本部分的屏幕录像中,我们即展示了这种最简单的同步方式,没有用户验证,没有错误处理,没有冲突处理,服务器端自动生成同步脚本。如需要这些进一步的功能,请继续关注我们后续的内容。

 

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

 

脚本:

命令行:

 

dbinit center.dbdbinit remote.db

建立ODBC center & remote

 

dbisql下,对center创建数据库模式:

 

CREATE TABLE dept(deptno CHAR(4) NOT NULL PRIMARY KEY,deptname VARCHAR(20))CREATE TABLE emp(empno INTEGER IDENTITY NOT NULL PRIMARY KEY,empname VARCHAR(20),gender BIT,deptno CHAR(4) NOT NULL,FOREIGN KEY (deptno) REFERENCES dept (deptno))

 

 

 

对center添加数据:

 

INSERT INTO dept VALUES('0000', 'HQ')INSERT INTO dept VALUES('0001', 'Sales')INSERT INTO dept VALUES('0002', 'Marketing')INSERT INTO dept VALUES('0003', 'Admin')INSERT INTO dept VALUES('0004', 'Education')INSERT INTO dept VALUES('0005', 'Presales')INSERT INTO dept VALUES('0006', 'Support')COMMITBEGINDECLARE @count INTEGERSET @count = 1WHILE (@count <= 2000)BEGININSERT INTO emp(empname, gender, deptno) VALUES('PERSON' + STR(@count,4), MOD(@count, 2), '000' + str(MOD(@count, 7),1))SET @count = @count + 1ENDEND

对remote数据库:

 

CREATE TABLE dept(deptno CHAR(4) NOT NULL PRIMARY KEY,deptname VARCHAR(20))CREATE TABLE emp(empno INTEGER IDENTITY NOT NULL PRIMARY KEY,empname VARCHAR(20),gender BIT,deptno CHAR(4) NOT NULL,FOREIGN KEY (deptno) references re_dept (deptno))

建立publication:

 

CREATE PUBLICATION Lab_all(TABLE dept,TABLE emp)

 

 

 

 

建立同步用户:

 

CREATE SYNCHRONIZATION USER "SIMPLE"

 

 

 

 

建立SYNCHRONIZATION SUBSCRIPTION:

 

CREATE SYNCHRONIZATION SUBSCRIPTION TO Lab_allFOR "SIMPLE"TYPE 'TCPIP'ADDRESS 'host=localhost;port=2439'OPTION ScriptVersion='Lab01'

 

 

 

命令行下:

启动同步服务器:

 

dbmlsrv9 -c "dsn=center" -x tcpip -o mlserver.mls -v+ -dl -za -zu+

 

 

触发同步:

 

dbmlsync -c "dsn=remote" -o dbmlsync.out -v -e "SendColumnNames=ON"