Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103611356
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Sybase

2008-04-10 20:59:06

  来源:赛迪网    作者:Breck Carter

分布式数据挑战

彼此没有固定联系的分布式数据库无法提供任何全系统锁定的机制。特别是没有任何机制可阻止您插入在两个不同远程数据库中具有相同主键的两行,从而在将这些行上传到统一数据库时造成主键冲突。

解决方案之一是使用由一个普通自动增量列加上数据库标识符组成的复合主键来解决不同数据库的自动增量值重叠问题。多列主键使外键定义过于复杂,令应用程序开发人员非常头疼,因此全局惟一标识符(GUID)有时被视为单列替代方案。GUID是具有形如“6F9619FF-8B86-D011-B42D-00C04FC964FF”的128位整型;具有惟一性,但会导致繁冗的数据库索引,同时这些值在调试时很难处理。而另一个解决方案是使用键池,中心服务器在键池处生成和下载唯一键值组,供单个远程数据库随后使用。键池确实是一种可行方案,但合理地实现和管理都非常困难,特别在多级层次结构上更是如此。另外,它们还会造成额外的网络流量。

ASA为全局惟一主键问题提供了一种更好的解决方案:通过GLOBAL AUTOINCREMENT列默认值提供的分区自动增量工具。为各数据库分配以唯一的数据库标识符:1﹑2﹑3等等,并且自动使用该值确定值的哪个分区或范围用于分配数据库的主键值。

这对 Mobile Inspector 应用程序非常重要,因为每个远程数据库的许多表都要频繁插入新行,而且它们都有自动分配或人工分配的主键。如下实例展示了用于在BLOB列中保存手绘草图的 BRI_SKTCH表。分区尺寸设定为2,000,000,也就是说每位检查员都能创建很多草图直至分区用尽。32位的有符号整型主键最大可达2,147,483,647;2,147,483,647除以2,000,000等于1,073,1,073是应用此机制而不产生主键冲突的数据库最大数量。32位的由符号整型用于Mobile Inspector程序;对于其他更大的应用程序,可使用64位无符号整型。

CREATE TABLE BRI_SKTCH ( 

SKTCH_ID INTEGER NOT NULL DEFAULT 
GLOBAL AUTOINCREMENT ( 2000000 ), 

STRCTR_ID INTEGER NOT NULL, 

SKTCH_TTL VARCHAR ( 45 ) NOT NULL, 

SKTCH_DES VARCHAR ( 130 ) NULL, 

FILE_NM VARCHAR ( 32 ) NULL, 

DEL_FLG_IND BIT NOT NULL DEFAULT 0, 

LST_MDFD_TS TIMESTAMP NOT NULL DEFAULT TIMESTAMP, 

SKTCH_LOB LONG BINARY NULL, 

SKTCH_NBR INTEGER NOT NULL, 

SKTCH_SZ_AMT INTEGER NULL, 

PRIMARY KEY ( SKTCH_ID ) );

分布式数据的另一挑战就是降低同步过程所需的网络流量。专业同步软件出现前,必须编写应用程序代码来确定需要来回传送的数据。有时这些代码会传输过多数据以确保不遗漏任何数据。其他时候,传输时间刚好和它搜索需要调整的差别一样长。

MobiLink客户端读取远程数据库事务日志来确定必须上传的数据,从而降低了网络流量。只有在上次同步之后插入﹑更新或删除的行才会被发送。另外,假如在两次同步之间,行进行过多次修改,则仅上传最终版本。

当建立下载流时,MobiLink服务器不具备相同的优势。因为它与不同的数据库协同工作,比如Oracle﹑SQL Server和DB2,MobiLink不能访问事务日志。假如您不想每次都下载完整的表,您必须在download_cursor 脚本中编写适当的WHERE子句。

阅读(561) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~