采用 Java 持久化框架:选择、时机和优缺点?

对于开发新软件系统来说,面向对象编程无疑是当今使用最为广泛的编程模式。由于商业数据的持久性需求,关系数据库管理系统(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 类型:SessionEntityMessage 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 作为持久化框架
  1. 首先您要考虑的是需要容器提供的服务。如果您的应用程序需要除持久化管理以外的其他容器提供的服务,比如转换管理、安全性和并发控制,则最好使用 EJB 框架。

  2. 另外还要考虑资源要求。EJB 框架可为需求应用程序提供完美的可伸缩性。但是,这也是有代价的:密集的资源要求,尤其使用 远程接口 模式时。只在没有资源限制的时候考虑应用 Entity EJB,以便获得所需的性能水平。

  3. 还有一个相关的因素是 de facto 框架。如果您正在进行某个基于 Java 平台的 EE 部署,则机会在于 EJB 容器已成为您的应用程序服务器的一部分。“为什么不用已经可用的?”可能是在你的架构决策制定过程中首先要问的问题。我把这看作是相对其他框架的一个“政治”优势,因为它已经可用了。

何时考虑将 EJB 的备选方案作为持久化框架
  1. 持久层的功能要求可能是提示您需求备选方案的第一个因素。如果您的应用程序不需要 EJB 框架提供的每个功能,则这表示您应该寻求一个备选方案。

  2. 资 源可用性超过了性能要求可能是另一个您想要寻求其他备选方案的情况。尽管 EJB 框架提供了完美的性能和可伸缩性,但是 EJB 框架的对资源的消耗也是非常惊人的。底线问题是:我们真的需要这个吗? 在很多情况下,写得很好的数据访问对象或 Hibernate 框架就可提供完美的备选方案。

  3. 尽管很少,但数据源(而不是关系数据库)可能阻止您使用容器管理的持久化框架。

如果您已经使用或计划使用 EJB 作为您的持久化框架,这里是一些您可以预期的优势和缺点。

Entity EJB 有什么优势?
  1. 该基于组件的分布式模型使其独立于网络 - EJB 组件可以部署到为其他应用程序提供服务的同一 JVM 上,或者位于不同地理位置的应用程序服务器的 JVM 上。

  2. 您将获得完美的可伸缩性:EJB 可以很好地向上扩展,因为容器可以汇聚实例,必要时可以进行激活和钝化。

  3. EJB 经过长时间的检验,已成为成熟的技术。而且,它经过发展,还可以提供更多有用的服务和功能。例如,计时器服务就是我最喜欢的服务之一;使用它,您可以计划 作业按指定的间隔执行(比如每晚、每周或每月)。在 EJB 3.0 中还有一项有用的功能“Java 语言元数据注释支持”,该功能消除了实体持久化所需的所有接口以及在 EJB 的查询语言中的增强。

Entity EJB 有什么缺点?
  1. 学习和使用 EJB 架构是不简单的。您应该准备学习一些术语,比如 remote interface(远程接口)home interface(Home 接口), activation(激活)passivation(钝化) 等等,其中大部分仅适用于 EJB 世界。

  2. EJB 架构不提供持久化独立。由于这些类在 EJB 容器中以其自己的方式使用,因此没有在其他框架中使用 EJB 类的简便方法。

  3. 对于 Entity Bean,要想获得可接受的性能水平一直是一个挑战,尤其是在远程接口模式中。

Java Persistence API

从 EJB 技术可以开始应用时起,对其在实际应用中的可用性就一直存在怀疑。在我看来,产生这种现象最重要的两个原因是复杂性和资源密集性。结果,随后出现了比 EJB 更简单、具有更小资源空间的框架(比如 Spring 和 Hibernate),并且更快流行开来。为了说明这一点,我们注意到 EJB 3.0 规范的方向相对以前出现了一个主要的转变。作为 JSR 220 的一部分,该规范提供了类似 Plain Old Java Object (POJO) 支持、Dependency Injection(依赖注入)和注释等功能。现在引入了一组全新的 API:Java Persistence API (JPA),以允许开发者管理 Java EE(甚至 SE)应用程序中的关系数据。另外,Sun 声称 Java Persistence API 表现了一些 Hibernate、TopLink(二者都会在稍后讨论)、JDO 以及 EJB 框架中最好的想法。

当前,GlassFish 项目提供了实施 JPA 的一个参考,JPA 在 GlassFish 应用程序服务器中作为 TopLink Essential 部分。您可以在 GlassFish 社区页 找到该 JPA 参考实施。不要混淆 TopLink Essentials 和 TopLink,前者现在是由 Oracle Corporation 拥有的关系映射工具。稍后我将在本文中讨论 TopLink 框架。

让我们来讨论一些您应该考虑应用 JPA 作为持久化框架的应用场景。

何时考虑将 JPA 作为持久化框架
  1. 您选择从流行的框架(比如 Hibernate、TopLink 和 EJB)中选择应用具有“好用”的功能且基于标准的框架。

  2. 您需要轻量级的持久化框架,且不需要 EJB 的容器提供的服务。

  3. 您需要可以在标准或 Enterprise Java 应用程序中使用的持久化框架。

何时考虑 JPA 的备选方案
  1. 您使用的 Java 的版本决定了实际是否可以应用 JPA。JPA 是 EJB 3.0 规范的一部分,而该规范是 Java EE 5 版本的一部分。如果您未更新到 Java EE 5,则无法使用 JPA。

  2. 您的应用程序需要 JPA 无法提供的服务,比如那些由 EJB 容器提供的服务,在那些情况下您更依赖 EJB。

在结束对此框架的讨论前,让我们列出一些使用 JPA 作为持久化框架的优势和缺点。

JPA 有什么优势?
  1. JPA 是基于标准的。越来越多的提供商期待在不久的将来提供 JPA 实施。

  2. 它提供了 Hibernate 和 TopLink 中最好的功能。

  3. 它可以和 Java SE 和 Java EE 应用程序一起使用,需要使用 EJB 容器,也可以不要。

JPA 有什么缺点?
  1. 由于非常新,JPA 规范可能还需要进过重要发展才会变得很稳定。

  2. JPA 是一个规范而不是一个产品。您需要提供商提供一个实施,才能获得这些基于标准的 API 的优势。

Hibernate

Hibernate 是一个对象持久化框架,简化了 Java 应用程序和底层关系数据库之间的对象关系映射。方法是提供 POJO 的透明持久化,作为“中介”层来提供自动持久化,并从 Java 应用程序加载对象到数据库表。借助 Hibernate,保存对象状态到数据库和从数据库加载对象状态与调用 Java 对象中的方法一样容易。您无需从您的应用程序代码中管理底层的数据操作;Hibernate 框架会为您完成所有的中间步骤。

让我们讨论一些您将会考虑应用 Hibernate 作为持久化框架的应用场景,以及那些您将寻求备选方案的应用场景。

何时使用 Hibernate 作为持久化框架
  1. 您正在寻求一个简单的持久化框架,该框架容易学习和使用。在您能够实际开始持久化您的 Java 对象到目标数据库之前,您只需要了解几个映射配置文件。

  2. 您正在寻求一个非常普通和灵活的持久化框架。Hibernate 的用法非常灵活:无论是否有应用程序服务器都可以使用,无论是否有关系数据库系统也可以使用。

  3. 您不想支付获取和维护费用。Hibernate 是开源而且免费的。

Hibernate 框架非常值得应用,因为它非常简单和灵活,同时也很强大。但是,在以下一些应用场景中您可能想要考虑应用其他框架。

何时考虑 Hibernate 的备选框架
  1. 您还不想要其他框架。尽管简单,Hibernate 框架仍然有自己的学习曲线、维护/更新周期,等等。

  2. 您需要容器提供的服务,比如那些由 EJB 提供的服务,在那些情况下您的选择局限于 EJB。

如果您正在使用或计划使用 Hibernate 作为您的持久化框架,这里是一些它的优势和缺点。

Hibernate 有什么优势?
  1. Hibernate 易于学习和使用。正如我在上面提到的,在您可以使用它之前,您只需要了解几个简单、自我描述的配置文件。

  2. 它 非常灵活。您可以在任何需要持久化服务的应用程序架构中使用 Hibernate。您可以通过 Servlet 和/或 Enterprise Java Bean 在 Standard Java 应用程序、Enterprise Java 应用程序中使用它。它也可以和 Spring 框架很好地集成。

  3. 它可以很好地向上扩展,因为它被设计为从底层一直到集群环境中工作。通过类似 Lazy Initialization 的技术以及通过 CGLIB 运行时间字节代码生成库优化 Java 反射,最新版的 Hibernate 的性能也得到了加强。

Hibernate 有什么缺点?
  1. Hibernate 是另一个拥有自己的应用和维护周期的框架。

  2. 尽管有积极的社区支持,但是有时候缺乏专注于此产品的提供商也使得宣传应用此框架显得没有说服力。

TopLink 是 Java 的另一个对象关系映射框架,为存储 Java 对象到数据库和 XML 文档以及从数据库和 XML 文档加载对象提供了强大而且灵活的框架。进过几次合并和收购(请参阅 TopLink 的 Wikipedia 页 中的历史简介), 从 2002 年开始 TopLink 已成为 Oracle Fusion 中间件的一部分。

在 2006 年,Oracle 将 TopLink 产品和开发资源中的源代码捐献到了 java.net GlassFish 项目中。该产品名为 TopLink Essentials,并成为 Java EE EJB 3.0 JPA 的参考实施。它是 Oracle 的 TopLink 产品的向下扩展的版本,去掉了一些功能,比如集群的应用程序之间的缓存同步、缓存验证策略和查询缓存。同样在 2007 年,Oracle 将 TopLink 产品和开发资源中的源代码捐献到了开源的 EclipseLink 项目中。

这里是一些你可能想要应用 TopLink 作为持久化框架的应用场景,以及一些您想要寻找备选方案的应用场景。

  1. 尽管 TopLink 可以适应和其他软件系统一起工作,但是如果您的软件系统使用 Oracle 软件产品的话会更好,因为这样可以构建一个来自同一提供商的同质软件产品套件。

  1. 您是一个非 Oracle 商店。如果您只有很少 Oracle 的软件,则您可以有更多适合您的需求的选择。这对于基于 EE 的应用程序服务器可能非常典型,因为在写作此文的同时,以市场份额而论 WebSphere、JBoss 和 WebLogic 是前三名领导的应用程序服务器提供商。

最后让我们评价一下应用 TopLink 作为持久化框架的优势和缺点。

  1. 如果您选择的软件队列中已经有大量 Oracle 产品,则 TopLink 是最理想的持久化框架选择。

  2. 它是由 Oracle 支持的一个非常成熟的框架,而且经过了时间的检测。

  3. 它拥有的高级功能,比如集群的应用程序之间的缓存同步、缓存验证策略和查询缓存,使其非常适合在需要高性能且集群的应用程序中应用。

  1. 它是私有的;其未来的方向由 Oracle 决定。

  2. 像使用任何新框架一样,它也有自己的学习曲线。

持久化框架选择列表

在继续讨论之前,让我在下表中总结一下以上讨论的框架。在该表中您将看到一般环境(时机)、您应该考虑的框架(选择)以及您获得的优势和缺点(优缺点)。您应该把这些看作是选择持久化框架过程的起点。您的最终选择应该基于这些和其他应用程序特定的要求(如果有)。

选择?
(考虑应用)
时机?
(您的应用程序是否需要)
有什么优势?
(您将获得这些优势)
有什么缺点?
(您将获得这些缺点)
Java Persistence API 用于 Standard 或 Enterprise Java 应用程序的简单持久化框架
  • 它是基于标准的。
  • 它结合了许多其他框架中“容易获得”的功能。
  • 它是一个规范:需要使用特定供应商的实现。
  • 不能在 Java 5.0 之前的版本中使用。
容器管理的 Entity EJB 容器提供的服务,比如安全和转换管理,以及持久化管理。
  • 基于分布式的组件
  • 良好的可伸缩性
  • 资源密集
  • 学习和使用非常复杂
  • 灵活性较差
Hibernate 您想要一个简单、灵活的框架
  • 无需获取和维护费用
  • 与其他框架良好集成
  • 学习和使用非常简单
  • 灵活:有无 EJB 均可使用,可以在 Standard 或 Enterprise Java 中使用
  • 开源
TopLink 您的软件系统已经使用了大量 Oracle 产品
  • 成熟的技术
  • 特定于供应商

其他持久化框架

在结束之前,我列出了其他一些持久化框架。在实际应用某个框架之前,这些框架也是值得探索的。本文不会详细讨论这些框架。

  • Castor:免费的开源数据绑定框架。
  • Kodo:BEA Systems 的对象关系持久化引擎。
  • Torque:针对 Java 平台的对象关系映射器,作为 Apache DB 项目开发。
  • iBatis:可以同时和 Java 和 .NET 应用程序一起使用的数据映射器框架。

结束语

很明显,您将为下一个 Java 应用程序应用哪个持久化框架将受很多因素的影响,比如所需的功能、获得和维护成本以及非功能性的要求(它的可维护性、性能等等)。一些私有和开源的框架现在都已可用,每种都有自己的优势(好处)和缺点(不足)。

在本文中,我根据三个标准对一些流行的 Java 持久化框架进行了说明:应用哪一个(定义框架)、何时应用(何时应该考虑应用以及何时应该寻求备选方案)以及有什么(优势和缺点)。本文中说明的应用场景 用于帮助您在实际选择应用的框架之前,基于更多信息做出正确的决策。因此,您应该基于本文中讨论的标准以及其他特定于此应用程序的当前和未来的需求,应用 您的下一个 Java 持久化框架。

参考资料

Sharad Acharya 在软件工程领域拥有超过八年的工作经验,涉及众多业务范围,包括供应链、保险、银行和抵押。

 

posted on 2008-01-14 05:42  岚之山  阅读(239)  评论(0编辑  收藏  举报

导航