从 MIDAS 到 DataSnap

在 Borland 刚刚发布的新产品 Delphi 6 中,原来在 Delphi 5 中的 MIDAS 被改称为 DataSnap 。 Borland 为什么要把 MIDAS 改名呢?我想如果不是 Borland 对 MIDAS 做了(或即将做)很大的改动,她没有必要把 MIDAS 改名, 虽然然市场宣传的需要也是一方面的原因,主要是为了和 Delphi 6 的另外两项重要的新特性: BizSnap 和 WebSnap 相对应。

我曾经对 MIDAS 技术大加吹捧(见 《我看 MIDAS 》《 MIDAS 与 Internet 》两篇文章),是因为 MIDAS 的确是一种在 Windows 平台下极好的多层数据库应用开发技术。 我认为多层技术较两层技术的优势是显而易见的,但仍然常常有人对此不解--两层要比多层简单多了,何必自找麻烦呢?来看看 Borland 是怎么解释的吧:

多层数据库模式将数据库应用程序合理地分块。客户端程序专门处理数据显示和用户界面。在理想的情况下, 它不需要了解数据是如何被存储及维护的。应用服务器(中间层)协调和处理来自多个客户端的请求和数据更新。 它处理了所有定义的数据集的细节以及与数据库的交互。

多层模式的优势包括以下几个方面:

  • 把业务逻辑封装在共享的中间层里。不同的客户端都访问相同的中间层。这可以使你减少由于在每个单独的客户端应用中重复你的业务逻辑所造成的冗余 (以及相应的维护成本)。
  • “瘦”的客户端。你的客户端应用程序可以写得很小,而把大多数工作交给中间层处理。客户端应用程序不仅是变小了, 而且还更加的易于发布,因为它们不需要再考虑安装,配置和维护数据库连接软件(例如 Borland 的数据引擎 - - BDE 以及数据服务器的客户端软件)的问题。“瘦”客户端应用程序可以通过 Internet 以更加灵活的方式发布。
  • 分布式数据处理。将一个应用系统的工作分布到几台机器上可以改善系统的性能,因为可以提供负载平衡以及用备用的机器去替代发生故障的机器。
  • 增强安全性。你可以通过使用不同的访问约束,来分层隔离敏感的功能。这提供了一个灵活的和可配置的安全层。 中间层可以限制敏感部分的入口点,使你能更加容易地控制对它的访问。如果你使用 HTTP, CORBA 或是 COM+ , 你还可以同时享受到它们支持的安全模式所带来的优势。

(以上内容译自 Delphi 6 的帮助之:Advantages of the multi-tiered database model部分, 未经 Borland 授权,小鸟E文水平有限,有什么错误,原因在我)

但是技术的发展总是能够超乎人们的想像,作为在 Delphi 5 中首先出现的 MIDAS 3 技术, 经过了将近两年时间的考验已经被证明是一种非常有效率的多层数据库应用开发技术,我也已经在不少地方看到了 MIDAS 的应用。 不过 MIDAS 3 仍然存在一些不尽如人意的方面。

其一是对组件化开发的支持不够。 OOA/OOD 在最近特别走红,到处都在谈论 UML/Rational Rose 等, 我想这主要是因为 COM+/CORBA/EJB 等技术的成熟、分布式技术日渐深入人心、中间层开发方法发生变化和用户对系统的灵活性有越来越高的要求等, 使得越来越多的人用组件化的方法来开发中间应用服务层。但对于在组件化开发中使用 MIDAS 会碰到一些问题, 李维在《Delphi 5.x ADO/MTS/COM+ 高级程序设计篇》一书中的第九章对这一问题作了初步的研究。 Delphi 6 为此增加了三个控件: TLocalConnection, TConnectionBroker, TSharedConnection 。关于它们,我想另外作文说明。

另外就是随着 Borland 改名以及同时带来的公司转型 (见 《我看 Borland 改名》一文),特别是跨平台的 Kylix 的发布, MIDAS 所存在的另一个问题也同时暴露出来:那就是无法跨平台。在去年 JBuilder 4 发布的时候,我就很希望 JB4 能够与 MIDAS 互联, 后来又以为 Kylix 能与 MIDAS 互联,但结果却都是失望。开始我一直不明白 Borland 为什么不提供 JB4/Kylix 与 Delphi/BCB 的 MIDAS 之间的互联, 后来对 MIDAS 有深入了解之后才明白:不是 Borland 不想,而是做不到。

因为整个的 MIDAS 都是基于 COM 技术的,这就决定了她无法简单地移植到其它平台上。 表面上, MIDAS 除了 DCOM 连接外,还提供了基于 TCP 数据流通信的 Socket 连接、基于 HTTP 的 Web 连接和基于 IIOP 的 CORBA 连接, 但本质上都是通过一个 Remote Data Module (即 RDM 或与其类似的 Transactional Data Module 或 CORBA Data Module ) 来与客户端进行数据传递,而在这些 RDM 与客户端之间传递的数据,即在 TDataSetProvider 与 TClientDataSet 之间传递的 Data 包是一个 OleVariant 类型的变量, 而这种类型的数据是和 COM 技术密切相关的。即使是用了各种不同的连接方式,也不过是将这个 OleVariant 型的数据重新编码一下而已。 正是因为这个 OleVariant 使 MIDAS 无法与 JB/KYLIX 互联,因为除了 Windows ,在其它操作系统平台下根本就没有 OleVariant 这种东东。 JBuilder 固然与 Delphi/BCB 差得太远,但 Kylix 却实现了 MIDAS 中相当重要的部分,如: DataSetProvider, ClientDataSet , 其中 ClientDataSet 已经包含了 RemoteServer 属性,但却还没有一个可以设置到这个属性上的控件。 而 DataSetProvider 也缺少相应的 RemoteDataModule 。