数据持久性是企业开发中最棘手的一个方面。一个企业数据持久性解决方案必须提供迅速的客户机事务,随着时间的过去确保数据完整性,以及在如系统崩溃和网络故障之类的日常灾祸发生时使数据继续存在。在 J2EE 探险者系列接下来的两个部分中,我们将着重讨论 J2EE 技术,这些技术有助于您为企业体系结构创建可靠的数据持久性解决方案。我们将通过简要地介绍企业应用程序中的数据持久性来开始该主题,然后继续更详细地讨论各种技术选项。在本部分中,我们将比较实体 bean 的一站式(single-stop)解决方案同更复杂的(但更健壮的)会话 bean 与 Java 数据库连接(Java Database Connectivity,JDBC)代码的组合。在下一部分中,我们将比较 Java 数据对象(Java Data Object,JDO)与实体 bean。
什么是数据持久性?
数据是任何计算机应用程序最重要的方面。计算机应用程序的核心是使某人或另一个计算机系统能够访问其数据。在企业环境中,数据不仅必须是可访问的(即,与用户界面连接并按一系列业务规则管理),而且还必须是持久的。 持久数据存储就是即使在服务器崩溃的情况下仍能存在的数据存储。
持久数据存在于应用程序的活动内存之外,通常在数据库或平面文件系统中。虽然持久数据被读入瞬时存储器以供使用或修改,但它始终被写到外部数据存储中以长期存储。美国国家标准与技术研究所(The United States National Institute of Standards and Technology)(请参阅 参考资料)定义了三种级别的持久数据:
部分持久数据是一种仅允许对最新版本更新的持久数据结构。
持久数据是一种保留其旧版本的数据结构;即,以前版本和当前版本都可能被查询。
完全持久数据是一种维护其数据的所有版本并允许对这些版本更新的持久数据结构。
大多数业务应用程序至少提供部分持久数据。这种类型的持久性在事务中期或者甚至在请求中期出现系统故障时容易遭破坏,这会导致数据不完整且常常遭毁坏。另一方面,在持久数据实现中,对系统中断或故障以“回滚(rollback)”回应,数据状态被回滚到上一个已知的良好配置。持久数据实现在企业体系结构和数据库管理系统(DBMS)中很常见。完全持久数据实现非常少见。完全持久数据实现的少数几个示例有:日志记录文件系统、VMS 文件系统(如 VAX 和 Mac OS X)以及并发版本控制系统(CVS)。
J2EE 中的持久性
信息时代非常强调分布式企业计算平台的使用。在这类平台上,必须不惜任何代价保护数据并使其永远持续存在,即使面临网络故障、内存泄漏和服务器崩溃时,也是如此。为了维护这种持久性,应用程序组件必须能够处理并发性、连接管理、数据完整性和同步。J2EE 的所有三种数据管理技术都为开发人员处理这些功能,但每种技术在处理时略有不同。
实体 bean,它提供健壮的数据持久性。bean 容器处理大部分的数据完整性、资源管理和并发性功能,从而使开发人员关注业务逻辑和数据处理,而不是这些低级细节。使用 bean 管理的持久性(Bean Managed Persistence,BMP)实体 bean 时,开发人员编写持久性代码而容器确定何时执行该代码。使用容器管理的持久性(Container Managed Persistence,CMP)实体 bean 时,容器生成持久性代码并管理持久性逻辑。
JDBC,当与会话 bean 结合时,它可提供简便的 EJB 开发和与平台无关的部署,而没有象 EJB 技术那样的资源使用和内存开销。象 BMP 实体 bean 一样,该解决方案要求开发人员编写持久性代码。与 BMP bean 不同的是,它还要求开发人员编写持久性逻辑。因而,开发人员负责确定何时将数据持久保留在数据存储中以及何时从数据存储装入数据。
Java 数据对象是最新的持久性机制。JDO 提供了面向对象的持久数据存储。开发人员使用 POJO(无格式普通 Java 对象,plain ordinary Java object)来装入和存储持久数据。
我们将在余下的文章中讨论实体 bean vs. 会话 bean 和 JDBC 组合的优缺点。