Posted on 2008-02-19 14:38
巴西木 阅读(372)
评论(0) 编辑 收藏 引用 所属分类:
Java
本文是对Java常用域对象持久化技术的比较。在本文中介绍了域对象的概念,讨论了为什么要引入持久化技术,并对目前5种Java常用的域对象持久化技术进行比较,评价它们各自的优缺点和适用范围。
一. 应用程序的分层体系结构
3层结构是目前典型的应用软件结构,3层即表述层、业务逻辑层和数据库层。其中表述层提供与用户的交互界面,GUI和Web页面是表述层的两个典型的例子;业务逻辑层实现各种业务逻辑;数据库层负责存放和管理应用的持久性数据。
在上述的三层结构中,业务逻辑层不仅负责业务逻辑,而且直接访问数据库,提供对业务数据的保存、更新、删除和查询操作。如果数据库改变或数据库的表结构发生变化,对业务逻辑层的影响非常大。为了把数据访问细节与业务逻辑分开,可以把数据访问作为单独的持久化层。持久化层封装了数据访问细节,为业务逻辑层提供了面向对象的API。完善的持久化层应达到以下目标:
代码可重用性高,能够完成所有的数据库访问操作;
能够支持多种数据库平台;
具有相对独立性,当持久化层发生变化时,不会影响上层的实现。
二. 软件的模型
在软件开发领域,模型用来表示真实世界的实体。在软件开发的不同阶段,需要为目标系统创建不同类型的模型。在分析阶段,需要创建概念模型。在设计阶段,需要创建域模型和数据模型。
构成域模型的基本元素就是域对象,即Domain Object,是对真实世界的实体的抽象。域对象可以代表业务领域中的人、地点、事务或概念。域对象包括3种:实体域对象、过程域对象和事件域对象。在三层应用结构中,以上3种域对象都位于业务逻辑层,实体域对象是应用的业务数据在内存中的表现形式,而过程域对象用于执行业务逻辑。
当实体域对象在内存中创建后,他们不可能永远存在,因此必须对域对象进行持久化。狭义的理解,“持久化”仅仅是把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库的各种相关操作,如:保存、更新、删除、加载、查询等。
三. Java中常用域对象持久化技术的比较
目前Java中共有5种常用的实现持久化的模式:
JDBC直接访问数据库
主动域对象模式
CMP模式
ORM模式
JDO模式
1、JDBC直接访问数据库
在这几种模式中JDBC的历史最为悠久,从Java诞生的那天起就有了JDBC,目前已经发展到JDBC3.0了。JDBC是一套规范,她规定了统一的标准接口,各个数据库厂商提供标准接口的实现。因此,只需要掌握标准的SQL语言就可以访问各种不同的数据库了。JDBC规范的出台,向世界宣告从此有了访问关系数据库的标准通用接口了。JDBC规范一经发布,获得了空前成功,很快成为java访问数据库的标准,JDBC获得了几乎所有数据库厂商的支持。这种数据库间的可移植性和Java一直高喊的口号Compile Once, Run everywhere遥相呼应。Java能有今天这么风光,JDBC可以说是功不可末。了。在没有JDBC的时候,各家数据库厂商都有自己的一套API,开发人员访问数据库非常困难,换个数据库,应用程序的修改量极大。JDBC今天还是java访问数据库的基石,本文中讨论的其他几种模式说到底只是更好的封装了JDBC, 提供了更为上层的更为强大的接口而已。
JDBC实现数据库访问的方式是在业务方法中直接嵌入SQL语句,SQL语句是面向关系的,依赖于关系模型。所以JDBC方式的优点是简单直接,特别是对于小型应用十分方便。
但是JDBC这种实现方式也给应用程序带来以下缺点:
(1)、实现业务逻辑的代码和数据库访问代码掺杂在一起,使程序结构不清晰,可读性差。
(2)、在程序代码中嵌入面向关系的SQL语句,使开发人员不能完全运用面向对象的思维来编写程序。
(3)、业务逻辑和关系数据模型绑定,如果关系数据发生变化,必须手工修改代码中所有相关的SQL语句,这曾经了维护软件的难度。
(4)、如果程序代码中SQL语句包含语法错误,在编译时不能检查这种错误,只有在运行时才能发现这种错误,这增加了调试程序的难度。
正是由于上述的缺点,为了使业务逻辑和数据访问细节分离,出现了下面的几种模式。
2、主动域对象模式
主动域对象是实体域对象的一种形式,它在实现中封装了关系数据模型和数据访问的细节。在 J2EE 架构中,EJB组件分为会话EJB和实体EJB。会话EJB通常实现业务逻辑,而实体EJB表示业务实体。实体EJB又分为两种:由EJB本身管理持久化,即BMP(Bean-Managed Persistence);由EJB容器管理持久化,即CMP(Container-Managed Persistence)。BM P就是主动域对象模式的一个例子,BMP 表示由实体 EJB 自身管理数据访问细节。
主动域对象模式有以下优点:
(1)、在实体域对象中封装自身的数据访问细节,过程域对象完全负责业务逻辑,使程序结构更加清晰。
(2)、如果关系数据模式发生变化,只需要修改主动域对象的代码,不需要修改过程域对象的业务方法。
主动域对象模式有以下缺点:
(1)、在实体域对象的实现中仍然包含SQL语句。
(2)、每个实体域对象都负责自身的数据访问实现。把这一职责分散在多个对象中,这会导致实体域对象重复实现一些共同的数据访问操作,从而造成重复编码。
主动域对象本身位于业务逻辑层,因此采用主动域对象模式时,整个应用仍然是三层应用结构,并没有从业务逻辑层分离出独立的持久化层。
3.CMP模式
在J2EE架构中,CMP(Container-Managed Persistence)表示由EJB容器来管理实体EJB 的持久化,EJB容器封装了对象-关系的映射及数据访问细节。CMP 和ORM的相似之处在于,两者都提供对象-关系映射服务,都把对象持久化的任务从业务逻辑中分离出来。区别在于CMP负责持久化实体EJB组件,而ORM负责持久化 POJO,它是普通的基于 Java Bean 形式的实体域对象。
CMP模式的优点在于:
(1)、他是基于EJB技术,是SUN J2EE体系的核心部分,获得了业界的普遍支持,包括各大厂商和开源组织等。如果选择它作企业级开发,技术支持会非常完备。
(2)、功能日趋完善,包括了完善的事务支持,EJBQL查询语言,透明的分布式访问等等
CMP模式的缺点在于:
(1)、开发人员开发的实体必须遵守复杂的J2EE规范,而多少ORM中间件没有类似要求。
(2)、实体域EJB只能运行在EJB容器中,而POJO可以运行在任何一种Java环境中。
(3)、尽管按照J2EE的规范,EJB应该是一种可移植组件,实际应用时确受到很大限制。而ORM中间件就不存在这样的问题。
4.ORM模式
ORM-Object/Relational Mapper,即“对象-关系型数据映射组件”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。建模领域中的 ORM 为 Object/Role Modeling(对象角色建模)。另外这里是“O/R Mapper”而非“O/R Mapping”。相对来讲,O/R Mapping 描述的是一种设计思想或者实现机制,而 O/R Mapper指以O/R原理设计的持久化框架(Framework),包括 O/R机制、SQL自生成、事务处理和Cache管理等。
一般把基于 Java Bean 形式的实体域对象称为 POJO(Plain Old Java Object),意为又普通又古老的 Java 对象的意思。随着各种 ORM 映射工具的日趋成熟和流行,POJO有重现光彩,它和基于 CMP 的实体 EJB 相比,既简单又具有很高的可移植性,因此联合使用ORM 映射工具和 POJO,已经成为一种越来越受欢迎的且用来取代 CMP 的持久化方案。POJO的缺点就是无法做远程调用,不支持分布式计算。
常用的ORM中间件有:Hibernate、Apache OJB、Cayenne、Jaxor、TopLink等。其中 Hibernate 的轻量级 ORM 模型逐步确立了在 Java ORM 架构中领导地位,甚至取代复杂而又繁琐的 EJB 模型而成为事实上的 Java ORM 工业标准。而且其中的许多设计均被 J2EE 标准组织吸纳而成为最新 EJB 3.0 规范的标准。
5.JDO模式
JDO是近几年新兴的数据持久性技术,Java Data Objects(JDO)是 SUN 公司制定的描述对象持久化语义的标准API。严格的说,JDO 并不是对象-关系映射接口,因为它支持把对象持久化到任意一种存储系统中,包括关系数据库、面向对象的数据库、基于XML的数据库,以及其他专有存储系统。由于关系数据库是目前最流行的存储系统,许多JDO的实现都包含了对象-关系映射服务。 JDO模式的优点是:
(1)、简单易用,不需要写大量无用的接口,不需要继承什么特殊的类,唯一所要做的就是对你的class文件做一下enhance。
(2)、真正面向对象。用了JDO的java程序是真正的面向对象,无需再理会数据库里面有什么表格,存取都是以java object为对象,所有数据库表格都是自动生成的。
(3)、方便的数据库移植。应用程序换数据库时候除了换一个JDBC driver, 换一下数据库URL,无需对程序做任何改动。
JDO模式的缺点是:
由于是新兴技术,一些IT巨头还没有给予足够的支持,其中包括IBM、Oracle、BEA。
四. 总结
关于这些技术优劣之争从它们刚刚出生那天起从来就没有停止过,而各家各派也从来没有能够说服过对方。对于应用开发者而言,撇开应用纯粹来争论技术优劣并没有多大意义。没有最好的,只有最合适的。在做开发的时候能够选择一个最合适于自己应用的技术,那就足够了。总的来说,JDBC面向RDBMS,比较适合关系数据库模式驱动的应用,例如统计表格数据,生成报表之类的应用。EJB 技术以J2EE应用服务器为中心,如果应用确实需要灵活的可声明的事务边界,需要支持大容量的访问和不间断的服务,需要应用服务器的集群,那么选EJB吧。JDO则面向对象,对于以域对象为中心的应用,包含图,树模型的应用,JDO是首选。