对于开发新软件系统来说,面向对象编程无疑是当今使用最为广泛的编程模式。由于商业数据的持久性需求,关系数据库管理系统(RDBMS)取得了最为 广泛的应用。RDBMS 使用的是关系模型,它与软件系统中的域对象模型有所不同。使用面向对象编程语言开发软件系统并使用 RDBMS 来持久存储数据时,数据持久化框架将成为应用程序架构中非常关键和重要的组件,它们的作用是隐藏应用程序数据持久化的底层复杂性。
在过去的几年中,一些持久化框架得到了很好的发展,它们可帮助您管理对象关系映射和数据持久性需求。但是,根据需要选择一个合适的框架并不是一件简 单的任务,因为多种因素会影响到这个决定。在本文中,我将根据三个基本标准来讨论如何一些应用比较广泛的 Java 持久化框架中做出选择:选择、时机和优缺点。在“选择”这部分中,我将介绍如何选择框架;在“时机”这部分中,我将讨论一些您应该考虑应用框架的应用场景 以及一些您应该寻找备选方案的应用场景;最后,在“优缺点”这一部分中,我将讨论当您决定采用某个框架时,该框架所有的优势和缺点。首先要讨论的是下面这 个在 Java 持久化领域中最著名的框架。
Entity Enterprise Java Bean
Java Persistence API
Hibernate
TopLink
让我们更加详细地讨论这些框架。
Entity Enterprise Java Bean
Enterprise JavaBean(EJB)技术是针对 Java 平台 Enterprise Edition (Java EE) 的一种托管的服务器端组件架构。在此定义中,“托管”和“服务器端”是关键术语。在 EJB 架构中,应用服务器 将管理一个或多个已部署的 EJB 的生命周期,并通过 EJB 容器提供公共运行时服务。容器提供的服务包括安全性、并发控制、事务和持久化管理等。
EJB 规范 定义了三种 Enterprise Bean 类型:Session、Entity 和 Message Driven。每种类型都具有一些独特特性,分别用于不同目的。由于本文是关于 Java 持久化框架的,我们将简单讨论一下 EJB 架构的持久化方面,讨论中会涉及使用 Entity EJB 管理您的 Enterprise Java 应用程序的持久化要求。
使用 EJB 设计应用程序时,EJB 表示业务域模型中的一个实体。例如,试想一个商业银行应用程序的 Account 实体。该 Account Entity Bean 将被部署到 J2EE 应用程序服务器中,该服务器将通过 EJB 容器给此 Entity Bean 提供一些运行时间服务。这种服务是自动持久化的,我将更加详细地讨论。
根据持久化实现的方式,Entity EJB 可以进一步划分为两种:Bean-Managed Persistence(BMP)和 Container-Managed Persistence(CMP)。使用 BMP,Bean 实例通过 JDBC 代码负责其状态的持久化。而使用 Container-Managed Persistence,EJB 容器提供自动管理 Entity Bean 的持久化的能力:当需要时,将状态保存到底层数据库或从底层数据库加载状态。
现在让我们讨论一些应用场景,在这些应用场景中您一般可能想要应用 EJB 框架,特别情况下可能使用 CMP 进行数据持久化。
何时考虑将EJB作为持久化框架
首先您要考虑的是需要容器提供的服务。如果您的应用程序需要除持久化管理以外的其他容器提供的服务,比如转换管理、安全性和并发控制,则最好使用 EJB 框架。
另外还要考虑资源要求。EJB 框架可为需求应用程序提供完美的可伸缩性。但是,这也是有代价的:密集的资源要求,尤其使用 远程接口 模式时。只在没有资源限制的时候考虑应用 Entity EJB,以便获得所需的性能水平。
还有一个相关的因素是 de facto 框架。如果您正在进行某个基于 Java 平台的 EE 部署,则机会在于 EJB 容器已成为您的应用程序服务器的一部分。“为什么不用已经可用的?”可能是在你的架构决策制定过程中首先要问的问题。我把这看作是相对其他框架的一个“政治”优势,因为它已经可用了。
何时考虑将EJB的备选方案作为持久化框架
持久层的功能要求可能是提示您需求备选方案的第一个因素。如果您的应用程序不需要 EJB 框架提供的每个功能,则这表示您应该寻求一个备选方案。
资 源可用性超过了性能要求可能是另一个您想要寻求其他备选方案的情况。尽管 EJB 框架提供了完美的性能和可伸缩性,但是 EJB 框架的对资源的消耗也是非常惊人的。底线问题是:我们真的需要这个吗? 在很多情况下,写得很好的数据访问对象或 Hibernate 框架就可提供完美的备选方案。
尽管很少,但数据源(而不是关系数据库)可能阻止您使用容器管理的持久化框架。
如果您已经使用或计划使用 EJB 作为您的持久化框架,这里是一些您可以预期的优势和缺点。
Entity EJB有什么优势?
该基于组件的分布式模型使其独立于网络 - EJB 组件可以部署到为其他应用程序提供服务的同一 JVM 上,或者位于不同地理位置的应用程序服务器的 JVM 上。
您将获得完美的可伸缩性:EJB 可以很好地向上扩展,因为容器可以汇聚实例,必要时可以进行激活和钝化。
EJB 经过长时间的检验,已成为成熟的技术。而且,它经过发展,还可以提供更多有用的服务和功能。例如,计时器服务就是我最喜欢的服务之一;使用它,您可以计划 作业按指定的间隔执行(比如每晚、每周或每月)。在 EJB 3.0 中还有一项有用的功能“Java 语言元数据注释支持”,该功能消除了实体持久化所需的所有接口以及在 EJB 的查询语言中的增强。
Entity EJB有什么缺点?
学习和使用 EJB 架构是不简单的。您应该准备学习一些术语,比如 remote interface(远程接口)、home interface(Home 接口), activation(激活)、passivation(钝化) 等等,其中大部分仅适用于 EJB 世界。
EJB 架构不提供持久化独立。由于这些类在 EJB 容器中以其自己的方式使用,因此没有在其他框架中使用 EJB 类的简便方法。
对于 Entity Bean,要想获得可接受的性能水平一直是一个挑战,尤其是在远程接口模式中。