其实,SDO2和EJB3(也称Java Persistence API - JPA) 规范之间差异还是很大的,与其说它们之间是竞争关系,倒不如说互补更为合适。
SDO野心很大,它妄图为各种SOA架构下的数据类型提供一个统一而灵活的API。EJB3则着眼于基于ORM的新型数据持久化技术,让EJB变得更简单,期间它还得到了来自Hibernate和Oracle ORM工具开发者的支持。
支持的语言
◆EJB 3.0仅用于Java
◆SDO API有着Java和C++两个版本, 但可以用其他语言实现(现在有PHP版本的). SDO定义了一套SDO的数据类型,确保了不同数据源之间和不同语言之间的可移植性。倒目前为止,SDO已有Java, C++, 和 PHP三个版本. 而EJB 3.0 仅面向Java,没有多语言的兼容性。
数据类型和格式
◆EJB 3.0 的数据持久化着眼于数据库中的关系型数据。
◆SDO 面向的是各种类型的数据,关系型数据只是其中的一种。开发人员了解SDO API后,可以访问任何SDO实现所支持的数据类型。除了有统一的数据访问API来从各种数据源读取数据以外,SDO还同时有统一的访问数据源的元数据的 API。其中,DataGraph和DataObject接口是SDO提供用来访问数据的,Type和Property接口则提供了访问元数据的API。
EJB 3.0 基于ORM, SDO关注数据
◆EJB 3.0 非常依赖ORM技术,而ORM技术在设计是为了将java对象持久化到关系型数据库(也称作‘逻辑优先’方式)或者是在Java对象和已有数据库间做映射(也称作‘意大利面条’方式).
◆SDO 采用 \'数据优先\' 的方式, 它假定数据库可以被优化(和范式化),并且比上层业务层有更长的生命周期。基于数据库是数据焦点的假定,FireStorm/SDO 将数据库结构反向工程以生成持久化代码。
SDO 是面向SOA架构的
◆EJB 3.0 是用于传统的单个Java应用,通常是C-S架构(译者按:这点牵强,不是很赞同)
◆SDO 支持脱机应用模型的概念,这非常适合SOA的架构。脱机状态的DataGraph意味着可以不锁数据库表,因为所有修改都是离线修改。
SCA 和 J2EE 规范
◆EJB 3.0 是JEE (J2EE的新叫法)的一部分, JEE是过去几年主要的应用部署平台
◆***版本的SDO规范同SCA规范一同发布了。SCA实现了分布式SOA架构下服务之间的点到点互动。SCA是业界对微软的 Indigo/WCF 战略的强有力的回应,也许是这两年 SOA/Web Services 上最重要的发展。
紧耦合和松耦合
◆EJB 3.0 是嵌入式,和应用耦合紧密。
◆SDO 的实现可以设计成适用于轻量级以及分布式的架构。SDO规范同时允许静态(强类型)调用和动态(弱类型)调用。
所以,由于目标和特性上的这些差异,不能说EJB3或SDO2哪个是更好的持久化规范,不过,我们可以从中得到一些思路:
◆如果你开发的是一个传统(非SOA)应用,用的是关系型数据库且全部用Java,那么EJB3是个不错的选择。
◆如果你使用SOA架构进行开发,或者需要访问不同类型的数据,那么SDO是个不错的选择。
【编辑推荐】