七、可伸缩性和可用性
虽然并非每一个工程都要求有企业级的恢复、可用性、可伸缩性功能,了解你所选择的OODB方案能够随着工程一起发展而提供这方面的能力是值得的。
| 标准 | 考虑… |
| 失败转移 | 主服务器出现问题时,透明地切换到冗余数据库。 |
| 负载平衡 | 把负载分布到冗余服务器、把对象分割到多个服务器、同步多个客户端对象缓冲之间数据视图的能力。 |
| 复制和增量备份 | 无缝地复制数据,支持负载平衡和恢复的能力。 |
| 专用的查询引擎(Ad hoc query engine) | 丰富的查询语言,允许对数据的快速访问;理想情况下,它应该能够跨越没有直接关联的对象连接数据。 |
八、产品评论
下面,我按照前文提出的标准评估以下产品:
|
| 标准 | ObjectStore | Versant Developer Suite | Poet | Objectivity |
| 背景信息 | ||||
| 供应商 | Object Design | Versant | Poet | Objectivity |
| 产品主页 | ObjectStore | VDS | FastObjects | Objectivity |
| 技术参考[29] | Spec 或 PDF data sheet | Overview 或 manuals | Java 或 C++ | PDF overview 或 specific data sheets |
| 版本 | 6.0 | 6.0 | t7 8.0[16] | 6.0 |
| 价格和许可 | ||||
| 试用版本 | 30天试用[1] | 60天试用 | 功能限制 | 90天试用 |
| 许可费用 | [2] | [2] | [2] | [2] |
| 联机支持 | 尚可[3][9] | 尚可[9] | 好[19] | 很好 |
| 用户社团[23] | 中等[4] | 中等 | 较小 | 中等 |
| 顺从性 | ||||
| ODL顺从性 | N | N | N | 不完整的2.0/3.0支持 |
| OQL顺从性 | N | N[10] | ODMG 3.0[17] | N |
| Java接口 | 遵从ODMG 3.0 | ODMG 3.0 | ODMG 3.0 | ODMG 3.0 |
| C++接口 | 支持 | ODMG 3.0 | N/A | 不完整的2.0/3.0支持 |
| Smalltalk接口 | N/A | N/A | N/A | ODMG 3.0 |
| 兼容性 | ||||
| 支持的Unix操作系统 | Linux,Solaris,HP-UX,IRIX,AIX,Tru64 [ref] | Linux,Solaris,HP-UX,IRIX,SGI,Tru64 [ref] | Linux,Solaris,HP-UX[ref] | Linux,Solaris,HP-UX,IRIX,AIX,Tru64 [ref] |
| 支持的Windows操作系统 | 98,NT4,2000 [ref] | NT4,2000 [ref] | 98,NT4,2000 [ref] | 98,NT4,2000 [ref] |
| JDK要求 | 1.0,1.1–1.3[22] | 1.2,1.3 | 1.1-1.3 | 1.22,1.3 |
| 持久类的特殊化 | N[5] | N[5] | N[5] | Y[24] |
| 可嵌入的版本 | Y | N | Y[18] | N |
| 功能 | ||||
| 数据库浏览器 | Y | Y | Y | Y |
| 客户端缓冲 | Y | Y | Y | Y |
| 数据库安全 | 数据库或者段的用户/组控制 | 数据库的用户控制[14] | 特定类和数据库的用户/组控制 | 数据库的用户控制 |
| XML支持 | Y | Y[15] | 部分[20] | 部分[20] |
| 性能 | ||||
| 加锁策略 | 数据库,页,或者对象 | 对象级 | 对象级 | 容器级[25] |
| 最大的数据库大小[7] | 数百个GB? | 数十个GB到数百个GB?[12] | ? | 根据报告,它达到了TB级 |
| 事务支持 | 死锁检测,MVCC [8] | 分布式事务管理(类似于MVCC的概念) | 检查点,共享或并行的事务,嵌套事务 | 检查点,死锁检测,共享或并行的事务 |
| 提供有关查询/性能的信息 | Y | N[13] | N | N[26] |
| 可伸缩性 | ||||
| 失败转移(failover) | Y | Y | Y | 可选[27] |
| 负载平衡 | 部分[6] | 部分[11] | 部分[21] | 可选[27] |
| 复制和增量备份 | Y | Y | Y | 可选[27] |
| 专门的查询引擎(Ad hoc query engine) | 没有OQL。使用集合和查询对象 | Y[10] | Y (OQL) | Y[28] |
■ 结束语
我希望自己还没有给人以OODB狂热鼓吹者的印象——对于我所使用的大多数应用,我认为应用OODB带有一定的风险。然而,一旦你理解并熟悉了OODB,它们可以成为很方便的工具。我个人比较看好Poet和ObjectStore,但我觉得它们都很有用。
■ 注解
| [1] | 只提供单实例个人版(Single-instance Personal Edition,PSE)供下载。 |
| [2] | 报价可以从销售代表处获得。 |
| [3] | 部分支持服务只提供给有效维护合同的拥有者访问。 |
| [4] | 社团规模只相对其他OODB产品而言。OODB的用户社团远远小于关系数据库的用户社团。 |
| [5] | 持久类必须进行事后处理。 |
| [6] | 多个数据库之间的负载平衡看来不太可能。相反,处理通过客户端缓冲得以分布,它把更多的逻辑和计算任务透明地移到了客户端,从而减小了服务器的负载。 |
| [7] | 这些数据未经证实,主要从供应商的声明获得。在讨论数据库大小的时候,对象的复杂性、大小、“合理的应答时间”等问题都是必须考虑的因素。 |
| [8] | 多版本并发控制(Multiversion Concurrency Control,MVCC)是一种非标准的技术,在并发读取/写入操作期间用来维持缓冲客户端和服务器端数据视图的一致性。 |
| [9] | 可以从大量在线演示、FAQ、论坛获益,所有这一切都对现有和潜在用户开放。 |
| [10] | 实现了一种私有的VQL语言,它和OQL有一些共同点。 |
| [11] | 通过复制实现部分负载平衡能力;根据推测,负载平衡可能通过把请求重定向到多个数据库实现,但这一点未经证实。多个数据库之间的透明复制确保了每一个OODB上都有一份最新的数据。 |
| [12] | 需要64位的版本,以便超越大量在内村、记录计数等方面的2^32限制;Versant的64位版本已经构造完毕,但还没有在所有它所支持的平台上经过验证。 |
| [13] | 提供一些用于查询调整和计时的工具。 |
| [14] | 如果不是我在什么地方错过,它似乎没有提到粒度更小的安全机制或者是在API中提供这方面的能力。我找到特别提及的只是通过OS强制的数据库文件权限实现的数据库级访问控制。 |
| [15] | 需要单独提供的工具。 |
| [16] | Poet分三种形式:t2(实时嵌入式Java),e7(嵌入式Java/C++),以及t7(企业Java/C++)。版本号没有明确显示,t7的v8.0得自文件的版本号,当前是8.0.0.19。 |
| [17] | 不能保证它完整地支持ODMG 3.0 OQL,但覆盖范围看来相当广泛。 |
| [18] | 包含一个C++或Java的嵌入式版本,以及一个Java的实时嵌入式版本。 |
| [19] | 联机支持网站community.fastobjects.com的内容非常全面,但速度常常很慢。我拥有高速连接,但它有规律地返回页面超时错误。 |
| [20] | 我只能通过命令行接口使用批量导入/导出功能。 |
| [21] | 没有分布式功能的任何明显标记,而且我也没有用过一个分布式的配置。如果Poet的配置中数据库复制带有“reader scalability”选项,负载平衡可以在某种程度上得以实现,使得查询可以对只读的从属数据库进行。 |
| [22] | 至少JDK 1.2看来最好,你将得到更好的集合支持和避免一些已经有报道的“quirk”问题(未能肯定是否为JDK 1.1解决了这些问题)。 |
| [23] | 很难进行评估。我从收入和Internet/新闻组的讨论入手分析。请把它看成是一种猜测。 |
| [24] | 持久类的标识或者是它从ooObj派生,或者它实现IooObj接口。 |
| [25] | 虽然对整个容器加锁听起来吓人,但它的基本思想是,它会显著减少加锁服务器的负载。 |
| [26] | 通过API调用和统计功能提供一些运行时查询调试能力。 |
| [27] | 一些资料,例如这一份说明,显示出这些选项会增加成本。 |
| [28] | 没有提供类似OQL的等价语言。SQL++是一种遵从SQL的功能,允许针对OODB进行SQL查询;容器支持一个scan()方法,以及支持“谓词查询语言”表达式(Predicate Query Language)。 |
| [29] | 这四种产品都提供评估版供下载。下载软件包附带的文档和示例一般都比较完善。 |