分布数据库并发查询系统

一、前言
        在某覆盖全省的信息查询系统设计过程中,遇到了现有各个地区已经有业务数据库,使用Oracle,但各个地区的数据表、字段是完全同构的。按照用户的想法,要在省中心建立一个只读数据副本的查询系统。由于各个地区数据量在数十万到数百万左右,因此,估算需要小型机系统、大型磁盘整列才能满足要求。但地区的数据变动非常频繁,使得省中心与地区的数据同步非常难以实现。
我们在设计系统时,觉得DCOM技术完全可以支持设计分布查询的能力,因此,提出采用DCOM技术实现分布实时查询。

二、系统框架
     
      用户请求(COM客户端) SELECT * FROM 客户表
             |
             |
      省中心  DCOM 服务
             |
             |
      省中心  并发线程查询
             |
        ------------------------------------------------------------
        |                                        |
        |                                        |
  地区中心  Oracle                        地区中心  Oracle
 
    设计了省中心DCOM服务,省中心的DCOM服务直接面对省上的查询用户,将SQL语句通过线程并发传输到各个地区的服务器上进行查询,然后各个地区的服务器负责解析查询并返回结果。最后在省中心进行数据合并。

三、技术优点
1、 降低系统造价,预算降低了一个数量级,硬件只需一台PC服务器即可。
2、 解决数据同步问题,由于省中心没有数据库,因此不存在数据同步问题。

四、实现环境
1、 各个地区和省中心通过2M光纤或128/256K DDN连接。
2、 地区数据库为Oracle。
3、 操作系统为Win2000 Server。
4、 开发工具为 Delphi。

五、关键技术
    1、并发线程:相对于Unix系统的并发进程优势,Windows系统的优势体现在并发线程支持比较好。因此我们选择创建多个线程的方法来同时连接多个地区。伪代码如下:

For i:= 0 to 地区个数 – 1 do
Begin
 AThread := TThread.Create(阻塞);
   
    AThread.SQL := ‘查询SQL语句’;
    AThread.连接信息 := ‘此地区的连接信息’;
AThread.Start;
End;

线程的任务为从指定的地区查询并返回数据。
Procedure QueryThread.Execute()
Begin
    按照连接信息建立连接;
    建立查询对象并设置查询语句;
    执行查询,将结果保存到ClientDataSet中;
End;

2、数据合并:我们将每个地区的结果数据放在单独的CLientDataSet中,然后进行数据合并。为了防止出现冲突,在合并数据的时候要加锁。
        在合并时,单独建立一个空的ClientDataSet,然后追加各个地区的数据,下面是追加数据的方法声明:
TCLientDataSet.AppendData(const Data: OleVariant; HitEOF: Boolean);
Data表示要追加的批量数据,HitEOF指出数据是否已经追加完毕。最后一个地区查询完毕时,要将它设置为真。
3、数据重构:因为许多查询语句都有排序、分组、聚合函数,所以,对于查询结果集,还必须进行重构处理后,才能返回用户。
4、部分事务支持:按照一般的设计规范,分布事务要么全部成功,要么失败。但用户的实际要求是支持在一些地区出现故障的情况下查询其它地区,只要在界面上提示出当时无法查询的地区即可。根据此要求,我们设计时专门将它作为配置选项实现。

六、系统运行情况
        长期运行稳定良好,在个别地区系统损坏的情况下一样可以查询可用地区;按平均地区数据为100万的情况进行查询,5秒以内就可以执行完毕。

后记:
        我是COM系列技术的反对者, COM的缺点如下:
1、 苯,IUnknown不断的需要转换,引用计数也会计错,分发时版本乱七八糟。
2、 不会流化,总是一些流化接口需要支持。
3、 IDL纯属多余,还很容易搞错。
4、 线程模型切换复杂。
5、 无法继承。
6、 学习困难。

        应当是发扬接口、抛弃COM才对。但在目前的某些特殊情况下,有时还得使用。


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值