- 面向对象数据库的供应商都奄奄一息。
- EJB 1.0 持久性很是吓人。
- Oracle 收购了 TopLink,震动了关系映射市场。
- 制定 JDO 规范和取得一些发展整整花费了很长的一段时间。
尽管如此,我们还是有理由保持乐观。小型厂商和开放源代码社区正在合作为 EJB 持久性模型寻找合适的替代品。
什么是持久性?
在深入讨论之前,我们应当给持久性下个定义。在其最广泛的形式中,持久性涉及到获取临时数据(比如内存里的程序数据)并存储为更持久的形式。本文中我们将使用一种更加通用的定义:
持久性框架将以最原始形式存在的临时程序数据转换成持久的数据存储,或执行相反的操作。
在我们的示例中,持久的数据存储很可能是关系数据库,而其原始形式是内存中的对象组成的 Java 程序。持久性框架负责管理数据库和在数据库与对象之间建立映射。
围绕持久性问题发生了很多激烈的争论,这并不会使我们惊奇。持久性本身就是一个棘手的问题。持久性框架应当允许关系数据库和对象之间灵活的建立映射,使模型之间产生冲突。持久性框架还必须提供惟一标识,而不会产生瓶颈效应。本文主要讨论这两个在 Java 中差别最大的问题。
持久性框架在其他方面也会有差异,但是他们似乎是 Java 的主要战场。这些是通用的持久性框架,他们各有优缺点。持久性框架都在为实现透明性而努力,并尽可能的模仿 Java语言。它们还必须引入诸如 lazy loading 和 aggressive caching 等性能特性来弥补抽象化关系数据库存取所带来的固定管理费用。
四种框架
本文将重点介绍四种不同的框架。每一种都在市场上占有一席之地。每一种也都有各自的缺点。我们将尽量介绍他们的优缺点。
可行的 EJB CMP
如果您正在用 EJB,那么就假设您只有一种选择:具有容器管理持久性(CMP)的 EJB 实体。由于 CMP 与 J2EE 应用程序服务器一起出售,因而它比市场上的其他产品更有优势。IBM、Sun 和 BEA 为制定了强大的政策支持。CMP 具备其作为市场领导者和作为 J2EE 标准组成部分的所有优势。
在很多客户通过 CMP 实现了成功地解决方案的同时,EJB 持久性很早就备受争议。在 EJB 2.0 之前,规范托管远程界面,而且不能表现对象之间的关系。这两个问题严重影响了性能,但是在 EJB 2.0 中都得到了解决。现在,一些 J2EE 客户可以高效的使用 EJB CMP,借助了合理的的性能。尽管如此,问题依旧存在。一些研究人员和客户正确地指出,EJB 持久性模型过于复杂并且存在基础缺陷:
- 组件导向。EJB 实体模型是一种组件模型,具有开发复杂度。也就是说,您无法表达继承这样的概念。您还必须为创建大部分实体编写六个 class(虽然一些开发环境和诸如 Xdoclets 的工具可以帮助您完成部分工作)。
- 粗糙。EJB 容器适合解决粗粒度(coarse-grained)问题,比如大段代码的安全性问题。而对解决细粒度(fine-grained)问题则不是很有效,比如小段代码的持久性问题。(BEA 的应用程序服务器可以通过优化减轻问题,允许您关闭部分容器服务。)
- 静态。EJB 查询必须在部署时就绑定,所以您无法建立动态查询。
总之,EJB 实体 bean 不能解决所有的问题,诸如复杂对象模型的持久性问题。但是,我们还拥有一些优秀解决方案。
专有的关系对象(OR)映射程序
两到三年之前,本文不会是一篇让人很感兴趣的文章。如果您想使用一种非常正式的 Java 持久性框架,那么就会选择 TopLink,它是以前市场的主宰。TopLink 速度快,并且可以快速的建立复杂关系映射,并且提供类似EJB 的几乎透明的 Java 模型。不过 Oracle 最近收购了 TopLink,而且 Oracle既是数据库供应商又是应用程序服务器供应商。如果您是一个 WebLogic 用户或者使用非 Oracle 的数据库,您就会在买 TopLink 之前仔细考虑一下。对于 Oracle 的用户来说这是个很好的产品,但是对于其他人来说就必须考虑 TopLink 潜在的方向性改变。当然了,您也可以购买其他的专有的 OR 映射程序。随之带来的问题是您购买了一种具有较低市场占有率的专有产品。您就不得不为此付出更多的资金来培训员工、聘请经验丰富的开发人员和购买配套工具。尽管用户会寻找专有的关系映射程序之外的产品,TopLink 还是市场的主宰。
JDO 是一个开放的替代产品
1998年,推广 JDO 的 Java Specification Request (JSR)被提交到 Java Community Process (JCP)。这是第12个 JSR,完成于2002年8月份。JDO 是一种透明持久性的规范。它没有规定数据存储的类型:为面向关系数据库和面向对象数据库都提供了解决方案。
JDO 的优点之一是它能很好的与大部分应用程序服务器结合使用。例如,SolarMetric 的 KodoJDO就是一个主流的 JDO 实现。您可以将其与 WebLogic 相结合,您的声明事务可以通过容器工作,正如您使用 CMP 一样。JDO 还有一些强大的功能:
- JDO 是一种标准界面。它由 JCP 正式制订,因此它比其他大部分的专有解决方案更权威。
- JDO 是透明的。您可以更自由地持久性 Java 对象模型。用 JDO 可以更容易地持久性抽象 class 和继承关系。
- JDO 具有灵活性。您可以持久性到多个数据源。您可以从多种商业实现中选择,或者使用开放源代码替代产品。(OJB 就很不错。)
尽管 JDO 是一个快速灵活的标准持久性框架,它仍然有反对者。有些人不喜欢大部分的 JDO 实现通过字节码增强来实现透明性。在使用 JDO 时,Java 源文件被编译成 class 文件。当需要持久性 class 时,为了产生可持久性的 class,必须通过字节码增强程序来运行这个 class。一些架构师认为字节码增强程序使构造过程复杂化,使调试更困难。然而,我至今还没有找到一位经历过这些问题的开发人员。需要注意的是,Java 字节码是基于开放规范的,正如 sJava 语言一样。
JDO 的另一个缺点是它没有市场冲击力。或许真是如此,但是 SolarMetric 最近将两项强大的技术廉价地整合到它的 JDO 产品中。注意,JDO 规范的1.0版本发布只有一年。那还只是很短的时间,现在下结论还为时过早。
最后,JDO 标准并没有规定对象到关系的映射。这就意味着您的映射文件在各种实现之间并不是可移植的。专有解决方案也存在这个问题。
Hibernate 是一个开源的宠儿
如果您正在寻求一个优秀的持久性框架,并且您喜欢开源软件的话,试试 Hibernate。它是个轻量级的持久性框架,功能却非常丰富。和 JDO 一样,用 EJB 或者不用 EJB,它都能与 Weblogic 结合得很好。其基本优势如下:
- Hibernate 使用 Java 反射机制 而不是字节码增强程序来实现透明性。
- Hibernate 的性能非常好,因为它是个轻量级框架。
- 映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
Hibernate 也有一些缺点。它限制您所使用的对象模型。(例如,一个持久性类不能映射到多个表)其独有的界面和可怜的市场份额也让人不安,尽管如此,Hibernate 还是以其强大的发展动力减轻了这些风险。其他的开源持久性框架也有一些,不过都没有 Hibernate 这样有市场冲击力。
没有明确的选择
当然,您可以自己写一个持久性框架,甚至压根就不用。您也可能会将注意力集中在另一个兴起的市场:数据联合(data federation),不过那是另一篇文章需要讨论的。
只要市场领头羊出现一些实际的或是被察觉到的问题,混乱的情况就会随之而来。Java 持久性也不例外。CMP是市场的领导者,但是 EJB 这一后盾正在开始走向某种轮回的死亡阶段。而作为替代品,TopLink 面临消退,Hibernate 则迅速上升。拥有许多优秀供应商的 JDO 是个好的选择,它也开始有所作为。
从窗户还能看到那堆生锈的自行车,不过那帮年轻人已经完成了一些特技。Java 行业也刚刚开始解决持久性的问题。
参考资料