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

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

步骤清单:

 

在上一部分中,我们看见在download_cursor表事件中有两个参数,其中我们使用了ml_username这个参数。那么, last_download这个参数是怎么使用的呢?我们注意到,last_download这个参数是TIMESTAMP类型的。它指明了上一次下载的时间。我们可以通过比较时间戳,来达到每次仅同步下载自上次下载以来更改过的数据。在下载阶段紧前面的最后一次成功的同步过程中,从统一数据库中获取的时间值即为 last_download 时间戳。如果当前用户从未成功地进行过同步,则该值将被设置为 1900-01-01。下图展示了MobiLink服务器与客户端在首次交互前后last_modified的变化情况:

 

在真正实施比较之前,我们需要在统一数据库一侧做一些改动,也就是在一些表上增加一个时间戳的字段。比如,我们在录像中对统一数据库实施了以下语句:

 

ALTER TABLE emp ADD last_modified TIMESTAMP NOT NULL DEFAULT TIMESTAMP

 

Oracle的映射数据类型为date

IBM DB2的映射数据类型为timestamp

MS SQL Server的映射数据类型为datetime

Sybase ASE的映射数据类型为datetime

 

时间戳方法是可以进行高效的同步的最实用的通用技术。此项技术涉及跟踪每个用户上次进行同步的时间,并使用此信息控制下载到每个远程数据库的行。

 

MobiLink 保留了一个用以说明每个 MobiLink 用户上一次下载数据的时间戳值。该值被称为上次下载的时间戳。上次下载的时间戳将作为一个参数被提供给许多事件,该时间戳还可以在同步脚本中使用。

 

 

如果您正在使用 Adaptive Server Anywhere 统一数据库,而且保存上次修改信息的列的类型为 DEFAULT TIMESTAMP,则不应同步该列。如果您的远程数据库需要这样的列,应使用不同的列名。否则,时间戳的缺省值可能被上载值覆盖,并不会包含上次在统一数据库中修改该行的时间。当我们在统一数据库中的表中增加了时间戳后,就可以在download_cursor中编写如下的脚本:

 

CALL ml_add_table_script('demo4','emp','download_cursor','SELECT empno, empname, gender, deptno FROM emp WHERE last_modified > ?')

所以,上述download_cursor的脚本中将只下载自上次同步后更改的数据。

 

本部分的代码如下:

 

center:ALTER TABLE emp ADD last_modified TIMESTAMP NOT NULL DEFAULT TIMESTAMPRemote:CREATE PUBLICATION Lab_04(TABLE emp(empno, empname, gender, deptno))CREATE SYNCHRONIZATION USER "Sales04"CREATE SYNCHRONIZATION SUBSCRIPTION TO Lab_04FOR "Sales04"TYPE 'TCPIP'ADDRESS 'host=localhost;port=2439'OPTION ScriptVersion = 'demo4'Center:CALL ml_add_table_script('demo4','emp','download_cursor','SELECT empno, empname, gender, deptno FROM emp WHERE last_modified > ?')COMMITcmd:dbmlsrv9 -dl -v+ -x tcpip -c "dsn=center" -o mlserver.mls -zu+dbmlsync -o dbmlsync.out -v -e "sv=demo4" -c "dsn=remote"