作者在 2006-10-29 18:24:00 发布以下内容
许多的Java程序都需要处理持久性数据,在大多数的情况下,需要和关系数据库打交道,可能是遗留数据库或是一个工业标准的数据库管理系统(DBMS)。JDBC 的API和驱动为大多数的数据库系统提供了一个使用SQL语言进行查询的标准方式,然而,在对象模型应用程序和关系模型的数据库的领域之间,“错误匹配问题”使得接口程序十分复杂。对象模型是基于软件工程的原理和业务领域的对象模型,而关系模型是基于数学原理和数据库有效存取规则。两种模型没有谁比谁更好,问题是两者是不同的,并不总能在程序中有效协调工作。
对于这个问题已经有一些解决方案,例如Hibernate和Java Data Objects,他们为开发者提供了透明的持久性——应用程序只需使用面向对象的API处理持久性的对象,而不需要在Java代码中嵌入SQL语句。对于EJB的容器来说,容器管理的持久性(CMP)做了类似的工作,但是对Java平台来说这不是一个一般的持久性工具。在任何这些解决方案中,对象通过底层框架被映射关系数据库中的表,这些底层的框架生成SQL所需要存取的对象的属性。也就是说,对象模型越复杂,这种映射就越困难。我们所用的描述符,通常使用XML文件,来定义这种映射关系。继承和多对多的关系,尤其是一些关系模型无法直接表示的关系增加了映射复杂度。继承的结构可以有不同的方式被映射到一组表中,选择何种方式就需要在储存的效率和查询的复杂度上权衡,就如一个单独的表要实现一个多对多的关系一样。
在一个数据库中存储一个对象,数据库本身如果就是一个对象模型,这样,就提供了另外一个解决方案。在二十世纪九十年代,各种各样面向对象的数据库管理系统被开发出来,但是这些数据库配置十分复杂,而且需要使用对象定义语言。对象是作为对象格式存储的,但是对应用语言来说它们不是本地化的。目前这些数据库产品并没对市场有大的影响,只是和一些将关系和对象混杂的数据库一样,在关系数据库面向对象的API上下功夫。
嵌入式数据库
在一些应用中,数据库管理系统的维护费用是必不可少的,在一些小功耗,可嵌入的数据库引擎条件下,可以更好的提供数据库的存储需求,例如,SQLite,提供了一个自我包含的数据库引擎。但是,因为这个JAVA的接口是通过一个JDBC驱动,这种以SQL为基础的解决方案也存在“错误匹配问题”。
在许多案例中,持久性问题可以变得相当的简单,如果使用嵌入式的对象数据库引擎话。这是一个很好的机会,我们来了解一下Carl Rosenberg创建的db4o。db4o曾经是一个商业的对象数据库,现在它是开源的,而且,最近获得了GPL(GNU通用公共许可证)的许可证。
Db4o的功能特点:
● 没有错误匹配问题——对象以其本身方式来存储
● 自动管理数据模式
● 存储时没有改变类特征,以使得易于存储
● 与Java(.NET)无缝绑定
● 自动数据绑定
● 一个250Kb的库文件的简易安装(Java jar or .NET DLL)
● 一个数据库文件
● 自动模式版本
● 查询实例
● S.O.D.A. (简单对象数据库访问), 一个开源查询的API
Db4o的优点
Db4o已经被一些嵌入式系统的应用程序所选用,这些程序特点都是要求零管理、高可靠性和低功耗的。例如,在德国,BMW Car IT在汽车嵌入式系统电子原型中使用了它。同样是德国的Die Mobilanten,他们在中型公共事业的PDA解决方案中使用了db4o。在美国,Massie Systems为婴儿眼睛诊断的视网膜图像处理系统依靠db4o加强其客户交流图像数据库。
在db4o中存储对象的方式相当的简单,同时,对于教学目的来说也相当具有吸引力。艾塞克斯(英)大学和德州农工大学都把db4o作为教学和研究对象。在我自己的学院,对于那些需要如何要将面向对象的概念应用到他们的项目中去的学生,和关系数据库打交道对于他们设计自己领域内的模型来说是一个负面的影响。使用db4o可以使得他们只需和持久层的数据打交道而不需要分心处理一个相冲突的不理解的数据关系模型,也不需要花费更多的时间学习一个工具,如Hibernate或一个复杂的OODBMS。同时,学习面向对象查询API的概念可能在将来被证明更有效。
同样的API,不同的存储
有时候,你正好不得不使用一个关系数据库。从一个Java开发者的观点来看,透明的持久性是理想境界。如果持久性可以通过面向对象的API实现,那么开发者就不必要为不同的数据存储来学习不同的技术。尽管db4o不是JDO兼容的(作为一个结果很容易使用),它的创造者的伙伴们有许多其他的开源项目,包括Mysql和Hibernate,它们使用单一的、一致的对象持久性的API和对象数据库交互,包括db4o本身,一些关系数据库或者其他存储模式,例如Prevayler。如果JDO对于你来说比较重要,你可以考虑ObjectDB,它是一个JDO兼容的纯对象数据库.
一个例子
这
对于这个问题已经有一些解决方案,例如Hibernate和Java Data Objects,他们为开发者提供了透明的持久性——应用程序只需使用面向对象的API处理持久性的对象,而不需要在Java代码中嵌入SQL语句。对于EJB的容器来说,容器管理的持久性(CMP)做了类似的工作,但是对Java平台来说这不是一个一般的持久性工具。在任何这些解决方案中,对象通过底层框架被映射关系数据库中的表,这些底层的框架生成SQL所需要存取的对象的属性。也就是说,对象模型越复杂,这种映射就越困难。我们所用的描述符,通常使用XML文件,来定义这种映射关系。继承和多对多的关系,尤其是一些关系模型无法直接表示的关系增加了映射复杂度。继承的结构可以有不同的方式被映射到一组表中,选择何种方式就需要在储存的效率和查询的复杂度上权衡,就如一个单独的表要实现一个多对多的关系一样。
在一个数据库中存储一个对象,数据库本身如果就是一个对象模型,这样,就提供了另外一个解决方案。在二十世纪九十年代,各种各样面向对象的数据库管理系统被开发出来,但是这些数据库配置十分复杂,而且需要使用对象定义语言。对象是作为对象格式存储的,但是对应用语言来说它们不是本地化的。目前这些数据库产品并没对市场有大的影响,只是和一些将关系和对象混杂的数据库一样,在关系数据库面向对象的API上下功夫。
嵌入式数据库
在一些应用中,数据库管理系统的维护费用是必不可少的,在一些小功耗,可嵌入的数据库引擎条件下,可以更好的提供数据库的存储需求,例如,SQLite,提供了一个自我包含的数据库引擎。但是,因为这个JAVA的接口是通过一个JDBC驱动,这种以SQL为基础的解决方案也存在“错误匹配问题”。
在许多案例中,持久性问题可以变得相当的简单,如果使用嵌入式的对象数据库引擎话。这是一个很好的机会,我们来了解一下Carl Rosenberg创建的db4o。db4o曾经是一个商业的对象数据库,现在它是开源的,而且,最近获得了GPL(GNU通用公共许可证)的许可证。
Db4o的功能特点:
● 没有错误匹配问题——对象以其本身方式来存储
● 自动管理数据模式
● 存储时没有改变类特征,以使得易于存储
● 与Java(.NET)无缝绑定
● 自动数据绑定
● 一个250Kb的库文件的简易安装(Java jar or .NET DLL)
● 一个数据库文件
● 自动模式版本
● 查询实例
● S.O.D.A. (简单对象数据库访问), 一个开源查询的API
Db4o的优点
Db4o已经被一些嵌入式系统的应用程序所选用,这些程序特点都是要求零管理、高可靠性和低功耗的。例如,在德国,BMW Car IT在汽车嵌入式系统电子原型中使用了它。同样是德国的Die Mobilanten,他们在中型公共事业的PDA解决方案中使用了db4o。在美国,Massie Systems为婴儿眼睛诊断的视网膜图像处理系统依靠db4o加强其客户交流图像数据库。
在db4o中存储对象的方式相当的简单,同时,对于教学目的来说也相当具有吸引力。艾塞克斯(英)大学和德州农工大学都把db4o作为教学和研究对象。在我自己的学院,对于那些需要如何要将面向对象的概念应用到他们的项目中去的学生,和关系数据库打交道对于他们设计自己领域内的模型来说是一个负面的影响。使用db4o可以使得他们只需和持久层的数据打交道而不需要分心处理一个相冲突的不理解的数据关系模型,也不需要花费更多的时间学习一个工具,如Hibernate或一个复杂的OODBMS。同时,学习面向对象查询API的概念可能在将来被证明更有效。
同样的API,不同的存储
有时候,你正好不得不使用一个关系数据库。从一个Java开发者的观点来看,透明的持久性是理想境界。如果持久性可以通过面向对象的API实现,那么开发者就不必要为不同的数据存储来学习不同的技术。尽管db4o不是JDO兼容的(作为一个结果很容易使用),它的创造者的伙伴们有许多其他的开源项目,包括Mysql和Hibernate,它们使用单一的、一致的对象持久性的API和对象数据库交互,包括db4o本身,一些关系数据库或者其他存储模式,例如Prevayler。如果JDO对于你来说比较重要,你可以考虑ObjectDB,它是一个JDO兼容的纯对象数据库.
一个例子
这