D0I:10.13374/j.issm1001-一053x.1999.0M.021 第21卷第4期 北京科技大学学报 Vol.21 No.4 1999年8月 Journal of University of Science and Technology Beijing Aug.1999 JAVA语言实现对象关系数据库的方法 刘庆文杨扬 北京科技大学信息工程学院,北京100083 摘要JAVA语言的产生以及JAVA虚拟机的跨平台性为开发新的对象关系数据库提供了方 便,提出了一种按照Atkinson正交持久化理论持久化对象,按照Association Algebra中关联算子 计算关联集来访问持久对象集的对象关系数据库的原理与方法. 关键词对象关系数据库:JAVA:PERSISTENCE 分类号TP309 目前关系数据库的研究已基本趋近成熟, 持,因为只要支持JAVA虚拟机,就可以作到不 而对象关系数据库的研究成为重点.典型的对 仅使对象持久也可以使类型持久,同时实现正 象关系数据库系统有两类:一类是由关系数据 父三原则.对于对象关系数据库,只有对象持久 库系统增加对类的支持和对象机制而构成的, 化仅仅是实现了对象的无缝连接也就是阻抗匹 如Informix中datablade模块,这种系统保特了 配,仍然不能进行应用中需要的集合操作,因此 与关系数据库系统的兼容性,但却是阻抗失配 还需要有对象数据库理论的集合语言.目前,A$- 的,即两种语言的类型系统不一致.另一类是在 sociation Algebra是有影响的一种对象关系理论 面向对象语言中增加对象持久功能而构成的, .如果要在JAVA语言中直接支持集合范型语 如O2,ObjectStore!,这种系统是阻抗一致的,但 言则需要对JAVA语言的语法进行扩充.我们认 却缺少SQL这种集合范型的查询语言设施,另 为可以在JAVA语言的基础上实现对象的正交 外,由于ObjectStore附着在C++上,由于编译系 持久化,同时支持Association Algebra的客户机 统的支持,持久对象不能使用持久化模式中的 服务器的对象关系系统 方法.此外,Glasgow大学Atkinson教授一直倡 导正交持久化语言.正交持久化认为语言中所 1JAVA对象关系数据库的原理 有的对象潜在都有同样的生命期.正交持久化 JAVA对象关系数据库是基于Atkinson的 设计的三原则是:(1)正交持久.不论什么类型的 正交持久化和Su的关联代数理论.一个典型的 对象都可以持久化,也就是说不仅对象被持久 正交持久化程序叫如下: 化了,而且对象的类型也被持久化了:(2)持久传 public class SaveSpag{ 递,对象的生命期是由它们的可达性来决定的, public static void main(String[]args){ 如果一个对象在程序执行之后仍然存在,要么 Spaghtti spl=new Spaghetti(27); 它被标识为一个持久根,要么它可以被·些已 Spaghtti sp2=new Spaghetti(5); 持久的对象引用:(3)持久独立.要求程序代码不 spl.add("somethingl"); 管是对长期数据(产生于稳定存储并且生命期 sp2.add("something2"); 超过程序的执行)或者是暂态数据(在一个常规 try{ 程序执行过程中产生并且只存在于程序的常规 PjavaStore pjs PjavaStore.getStoreO; 执行过程中),传统的程序设计语言如果没有专 Pjs.newPRoot(r1,sp1); 用编译程序就不能实现对象正交持久化,特别 catch(PJSexception e)(.)}} 是不能支持方法.JAVA为对象持久化提供了支 newPRoot方法建立一个String和spl之间 的约束,并把它记录为一个持久根,在函数执行 1998-09-12收稿刘庆文男,27岁,硕士
第 卷 第 期 年 月 北 京 科 技 大 学 学 报 心 语言实现对象关系数据库 的方法 刘庆文 杨 扬 北京科技大学 信息工程学院 , 北京 摘 要 语 言 的产 生 以及 虚拟机的跨平 台性为开发新 的对象关系数据库提供 了方 便 , 提 出 了一 种 按照 正 交持久 化理论持久化对 象 , 按照 中关联算子 计 算关联集 来访 问持久对象集的对象关系数据库的原理与方法 关键词 对 象关 系数据库 分 类号 目前 关 系数 据 库 的研 究 己 基 本 趋 近 成 熟 , 而 对 象关系数据 库 的研 究成 为重 点 典型 的 对 象 关 系数 据 库 系统 有 两 类 一 类 是 由关 系数 据 库 系统 增 加 对 类 的支持和 对 象机 制而 构 成 的 , 如 中 模块 , 这 种 系统 保 持 了 与 关系数据 库 系统 的兼容性 , 但 却 是 阻 抗 失配 的 , 即 两 种 语 言 的类 型 系统不 一 致 另一 类 是 在 面 向对 象 语 言中增 加 对 象 持久 功 能 而 构 成 的 , 如 , ‘” , 这 种 系统是 阻 抗 一 致 的 , 但 却 缺 少 这 种集合 范 型 的查 询 语 言设 施 , 另 外 , 由 于 附着在 上 , 由于 编 译 系 统 的支持 , 持久 对 象不 能使用 持久 化 模式 中的 方法 此外 , 大 学 教 授 一 直 倡 导 正 交 持 久 化 语 言 正 交持 久 化 认 为 语 言 中所 有 的对 象潜在 都 有 同样 的 生 命 期 正 交 持 久 化 设计 的三 原 则 是 正 交持 久 不 论什么 类型 的 对 象 都 可 以持 久 化 , 也 就 是 说 不 仅 对象被持久 化 了 , 而且对 象的类型 也被持久 化 了 持久传 递 对 象 的生命期 是 由它 们 的可 达 性来决 定 的 , 如 果 一个对 象在 程 序执 行之 后 仍 然存 在 , 要 么 它 被标识 为一 个持 久 根 , 要 么 它 可 以被 一 些 已 持久 的对象 引用 持久独 立 要求程序代码不 管 是 对 长 期 数 据 产生 于 稳 定 存储 并且 生 命 期 超 过 程序 的执行 或 者 是暂态 数据 在 一 个 常 规 程序执行 过程 中产 生 并且 只 存在于 程序 的常规 执 行 过 程 中 传 统 的程序设 计 语 言如果 没 有专 用 编译 程 序就 不 能 实现 对象正 交持久 化 , 特 别 是 不 能支 持 方法 为对象 持久 化提供 了支 持 , 因 为只 要 支持 虚拟 机 , 就 可 以作到 不 仅 使对 象持 久 也 可 以使类型持久 , 同时实现正 交三 原 则 对 于 对 象 关 系数据库 , 只 有对 象持久 化 仅仅是 实现 了对象 的无缝连接也 就是 阻抗 匹 配 , 仍然不 能进行应 用 中需要 的集合操作 , 因此 还 需 要 有对 象数据库 理 论 的集合语 言 目前 , 是有影 响 的一 种对象关系理 论 如 果 要 在 语 言 中直 接支 持 集 合范 型语 言则需要 对 语 言的 语 法进 行扩充 我们 认 为可 以在 语 言的基 础 上 实现对 象 的正 交 持 久 化 , 同 时支 持 的客户机 服 务器 的对 象关 系系统 对象关系数据库 的原理 对 象关 系数据 库 是 基 于 的 正 交持久 化 和 的关联 代数理 论 一个 典型 的 正 交持久 化 程 序川 如 下 〕 ” ” ” ,, 毛 巧 , 诬… 方法建立 一 个 和 之 间 的约束 , 一 一 并把它 记 录 为一 个持久 根 在 函数执行 收稿 刘庆 文 男 , 岁 , 硕 士 DOI :10.13374/j .issn1001-053x.1999.04.021
Vol.21 No.4 刘庆文等:JAVA语言实现对象关系数据库的方法 ·393· 的最后,与main隐式相关的事物将要提交,随 class C{.Bobj;}可以有如下查询: 后新标识的持久对象和所有从持久对象可达的 select A.attribl,B.attrib2 对象都被提升到持久状态.用以下方法重用持 from C*B 久对象. where some-condition public class SpagShow{ 其中attribl是类A的属性,attrib2为类B的 public static void main (String[]args){//start 属性,*关联算子, traction JAVA语言不能直接执行AQL语句,因此 try {//catch store exception 我们通过服务器来执行AQL程序,并将结果返 PjavaStore pjs=PjavaStore.getStore();//obstain 回到客户端.例如: persistent store AQL.Execute("select A.attribl,B.attrib2 from Spaghetti sp=(Spaghetti)pjs.getPRoot(r1);//get C*B where some-condition"); persistent object 并返回set,list,bag等Collection类对象.AQL还 Sp.displayO); 有commitbegin保留提交前现场,commitend开 catch(PJSException e){...))//handle excep- 始提交,abort恢复提交前现场,AQL支持commit tion 的嵌套执行,客户端与服务器是通过JAVA RMI PjavaStore对象用来得到一个持久根,getPRoot 进行联接的, 方法得到持久对象.Atkinson的正交持久化是 基于命名,我们认为对象持久应该是基于对象 2JAVA对象关系数据库的实现方法 标识oid的.因此,我们修改JavaStore的方法使 之是支持oid.JavaStore在加入持久对象之前,首 JAVA对象关系数据库的结构如图1, 先寻找此对象的持久根,但不是以命名寻找而 JAVA对象关系数据库由CLIENT和SER- SERVER 是以此对象的类为模板寻找,如果找到根则将 CLLENT 此对象加入到此根的对象蔟之中,否则则建立 交互AQL 应用程序 RMI AQL解释器 以本对象的类为模板的根同时加入对象.这样 持久API 持久引擎 建立了数据库的模式,在进行重用时,首先将模 JAVA虚拟机 JAVA虚拟机 式类装入Java堆之中,然后生成对象. 当JavaStore中有很多同一类的对象时,则 图1JAVA对象关系数据库的结构 VER两部分组成,SERVER由交互AQL,AQL解 要通过Association Algebra的代数运算求得结果 释器,持久引擎和JAVA虚拟机组成.交互AQL 类对象集.Association Algebra共有9种算子有 丰富的语义表达能力,分别对对象的关联模式 处理交互AQL的解释,AQL解释器解释AQL 集进行运算以产生新的关联模式集,我们通过 语句、持久引整管理对象的虚拟内存与库、JAVA 虚拟机管理类的装入、对象实例的生成、AQL语 Association Algebra对SQL进行修改扩充为AQL 句中引用的类的方法的解释,CLIENT由应用程 (Association Query Language),其中把SQL中的 序、持久API和JAVA虚拟机组成.应用程序通 WHERE子句中的关系改为关联集.几种语句为: SELECT CLASS.ATTRIBUTE 过持久API持久化对象. FROM ASSOCIATION SET SERVER不停的监听AQL语句解释的请 求,在收到AQL语句时为此语句的建立解释线 WHERE CONDITION 程然后继续监听.而AQL解释线程启动,首先 PDATA CLASS.ATTRIBUTE WITH SOME- 对AQL语句进行语法分析,然后对关联集求值, THING 并返回结果.在server端需要虚拟内存的支持. FROM ASSOCIATION SET WHERE CONDITION l个Javastore由3个表组成:类名表,类表(存放 INSERT INTO ASSOCIATION_SET 类的字节码),对象表(存放类的持久对象).在 WITH CLASS.ATTRIBUTE="... Javastore被打开之后3个表都被读入到虚存之 例如对类 中,并生成虚拟地址与javastore中地址的对照 表,如图2所示, class A);class B extends A{);
、 勺 刘 庆文 等 语 言 实现对 象 关系数据 库 的方法 的最 后 , 与 隐式相 关的事物将 要 提交 , 随 后 新标识 的持久对 象和 所 有从 持久 对 象可 达 的 对 象都被提 升到持 久 状态 用 以下 方 法 重 用 持 久 对象 〕 王 · 麦… 旅即 巧 对象用来得到一 个 持久根 , 方 法 得到持久对象 的正 交持久 化是 基 于 命名 , 我们 认 为对象 持久 应 该 是基 于 对象 标 识 的 因此 , 我们修改 的方法使 之 是 支 持 在加入持久对象之 前 , 首 先 寻 找此对象 的持久 根 , 但 不 是 以命名 寻 找而 是 以此对 象 的类为模板寻 找 , 如 果找到根则将 此对象加 入到 此根 的对 象簇之 中 , 否 则则 建立 以本对 象 的类为模板 的根 同 时加 入对 象 这样 建立 了数据库 的模式 在进 行 重用 时 , 首先将模 式类装入 堆之 中 , 然 后 生 成对 象 当 中有很 多 同一 类 的对 象时 , 则 要通过 的代数运 算求得结果 类对 象集 共 有 种 算子有 丰 富 的语 义表 达 能力 , 分 别 对对 象 的 关 联模式 集 进 行运 算 以产 生 新 的 关 联 模式集 我 们 通 过 对 进行修改扩 充 为 休 卿 , 其 中把 中的 子句 中的关系改为关联集 几种语句为 , 户 , 户 , , ,,… ” 例 如对类 … … 可 以有如下 查 询 , 一 其 中 是 类 的属 性 , 为类 的 属 性 , 关联 算子 语 言不 能直 接执 行 语 句 , 因 此 我们 通过服 务器 来执行 程序 , 并 将 结果返 回到 客户端 例如 ,, , 一 ,, 并 返 回 , , 等 类对 象 还 有 保 留提 交前现 场 , 开 始提交 , 恢复提交前现场 , 支持 的嵌套执行 客户端与服 务器 是 通 过 进行联接的 对象关系数据库 的实现方法 对 象 关系数据 库 的结构 如 图 对 象关系数据 库 由 和 交互 应用程序 解释器 持久 持久引擎 虚拟机 虚拟机 图 对象关系数据库的结构 两 部 分 组 成 , 由交互 , 解 释器 , 持久 引擎和 虚 拟机组 成 交互 处 理 交互 的解释 , 解 释器解 释 语句 、 持 久 引擎管理对象 的虚拟 内存与库 、 虚拟机管理类的装入 、 对象实例 的生成 、 语 句 中引用 的类 的方法 的解释 由应用 程 序 、 持久 和 虚 拟机 组 成 应 用 程 序通 过 持久 持久化对 象 不 停 的监 听 语 句解 释 的请 求 , 在收到 语 句 时为此 语句 的建立 解释线 程然后 继 续监 听 而 解 释 线程 启 动 , 首先 对 语句进行语法 分 析 , 然后 对 关联集求值 , 并 返 回结果 在 端 需要 虚拟 内存 的支持 个 由 个 表 组成 类名 表 , 类表 存放 类 的字 节码 , 对 象表 存 放 类 的持久对象 在 被打 开之后 个表都被读入 到虚存之 中 , 并 生 成虚 拟 地址 与 中地址 的对 照 表 , 如 图 所 示
·394 北京科技大学学报 1999年第4期 R length Classname class byte code 属性域 01 反指针域 … 正指针 02 图2对象虚拟空间管理图 classname表存放类名,class byte code表存 Teacher Student 放类的字节码O1和O2是对象,RV表存放实地 RV 址与虚拟地址的对照. 在Javastore之中对象中的引用是按实地址 (Javastore库中的地址)存放的,同时为了保正引 VV表I Associate Course 用完整性在对象的最后还有引用者对象表(反 VV RV 指针表).为了能在虚存之中引用正确的对象, 建立实地址和虚地址转换表RV表,访问类是 通过虚拟地址进行的,当需要访问一个引用对 VV表2 象时,通过RV表得到虚地址来访问对象.例如 Associate() 在图2中当O2引用01时,对象中的引用地址 是O1的实地址,通过RV表找到O1的虚拟地 址就可以访问对象O1了, 当需要插入一个对象时,先查找类名表和 图3关联集Teacher*Student*Course求值 类字节码表看是否此类已存在,若不存在则先 对象OID表,右边是与Teacher类关联的Student 将类名与字节码插入,然后在虚拟空间中分配 类对象,然后VV表1与Course表进行关联算 空间,插入对象并填写V表,同时建立反指针 子()运算生成VV表2.关联集的结果就是通过 保证引用完整性.此时V表中R为空,则访问 VV表的遍历来查询, 引用对象时按对象中的地址访问.若此类已存 当开始一个事务时,类名表,类字节表,对 在,则已存在则直接插对象,并填写RV表和反 象表,RV表被保存,事务结束时类名表,类字节 指针域.当要删除一个对象时,通过RV表找到 表,对象表被写入Javastore同时删除保留的现 对象,若反指针域都为空,则删除对象并删初类 场.如果事务中间流产则恢复现场.Javastore支 名与字节码表项,否则为保证引用完整性仅删 持事务嵌套, 除反指针. JAVA对象关系数据库的实现在client端需 对于AQL的解释最关键的是关联集的求 要JAVA反射的支持,通过JAVA反射功能来得 值,求值后的关联模式用VV表表示,图3显示 到对象的类型,属性与值,当对对象持久化时, 了求值过程, 对对象引用的对象进行遍历以使可达的都持久 图3表示了关联集Teacher*Student*Course 化,然后调用持久API写入Javastore之中.持久 的求值过程,首先由Teacher类的RV表与Stu~ API主要有openStore打开仓库,createStore创建 dent类的RV表进行关联算子()运算生成VV 仓库,addObject加入对象,exectuteAQL执行 表l,其中左边是与Student类关联的Teacher类 AQL语句,closeStore关闭仓库,deleteStore删除
北 京 科 技 大 学 学 报 年 第 期 日 厂 酗 一、 日 属性域 反指针域 口 , 正指针 - 图 对象虚拟空间管理图 表存 放类名 , 表存 放类 的字 节 码 和 是 对 象 , 表 存放 实地 址 与虚拟地址 的对 照 在 之 中对象 中的引用 是 按 实地址 库 中的地址 存放 的 , 同时 为 了保 正 引 用 完整性在对象 的最 后 还有 引用者对 象表 反 指针 表 为 了能在虚存 之 中 引用 正确 的对象 , 建立 实地 址和 虚地址 转换表 表 访 问类 是 通过虚拟 地址进行 的 , 当需要访 问一个 引用 对 象 时 , 通过 表 得 到虚地 址来访 问对象 例 如 在 图 中 当 引用 时 , 对象 中 的引用 地址 是 的 实地址 , 通 过 表 找到 的虚 拟 地 址 就 可 以访 问对象 了 当需 要插 入 一 个对 象 时 , 先 查 找类名 表和 类字节码 表看 是 否 此类 己存 在 , 若 不 存在则 先 将类名 与字 节码插入 , 然 后 在 虚拟 空 间 中分 配 空 间 , 插入 对象 并 填 写 表 , 同 时建立 反 指 针 保证 引用 完整性 此 时 表 中 为空 , 则访 问 引用 对象 时按对象 中的地址 访 问 若 此类 已存 在 , 则 已 存在 则 直 接插对象 , 并 填 写 表 和 反 指针 域 当要 删 除一 个对 象 时 , 通 过 表 找到 对象 , 若反 指针域 都为 空 , 则删 除对 象 并删 初 类 名 与字节 码 表 项 , 否 则 为保证 引用 完整 性仅 删 除反 指针 对 于 的解 释 最 关键 的 是 关联 集 的 求 值 , 求值后 的关联模 式用 表 表 示 , 图 显 示 了求 值过 程 图 表 示 了关联集 的求值过 程 首先 由 类 的 表 与 类 的 表 进行 关联 算子 运算生 成 表 , 其 中左边 是 与 类 关 联 的 类 圈 关联集 求值 对 象 表 , 右边是 与 类关联 的 类对象 , 然后 表 与 表进行 关联算 子 运算生 成 表 关联集 的结果就是通过 表 的遍历 来查询 当开 始一 个事 务时 , 类名表 , 类字节 表 , 对 象表 , 表被保存 , 事务结束 时类名 表 , 类字节 表 , 对象表被写入 同时删 除保 留的现 场 如 果 事务中间流产则恢复现场 支 持事务嵌套 对象关系数据库 的实现在 端需 要 反 射 的支持 通 过 反射 功 能来得 到对象 的类型 , 属性与值 , 当对对象持久化 时 , 对 对象引用 的对象进行遍历 以使可达 的都持久 化 , 然后 调用 持久 妙 写入 之 中 持久 主 要 有 打 开 仓 库 , 创 建 仓 库 , 加 入对 象 , 执行 语 句 , 关 闭仓 库 , 删 除
Vol21 No.4 刘庆文等:JAVA语言实现对象关系数据库的方法 ·395· 仓库几种API. 此来完成持久对象的访问. 图4表示了对象的可达关系.图中Obj1引 由于Javastore是一个外挂的系统,不是对 用0bj2,0bj2引用0bj4,0bj1引用0bj3,0bj5引 虚拟机进行重新开发,因此只能持久对象中的 用Obj3.持久化Obj1时要遍历Obj1的引用链 public属性,对于private和protected属性无法持 并把Obj2,Obj3,Obj4都持久化(同时有反指针 久化. 来保正完整性).在CLIENT端有表 来防止对象的重复加入.当同时持久化Obj1, 4结论 ObjS时,必须对Obj3检查,若已加入到Javastore 在对象关系数据库的研究之中,在没有 之中则不必重复加入 JAVA虚拟机之前,对象的方法不能持久化也不 Obj1 Obj2- Obj4 能被访问.JAVA产生之后,借助于正交持久化 Obj3 的理论可以产生带方法的模式,按照关联代数 Obj5 的方法可以用集合化的方法访问持久对象和它 图4对象可达关系图 的方法,加上JAVA的跨平台性可以很自然的分 AQL的结果返回到集合类型set,list,bag等 布到网络中,形成网络对象关系数据库,这将优 类型之中.应用程序用这些类中的方法访问集 于以往的系统. 合中的个体元素.集合中的元素并不在CLIENT 参考文献 端,Javastore使用懒惰方法访问持久对象,即只 1 Bindou R.R.Object-oriented Databases Technology,Ap- 有当访问到该元素时才从SERVER中装入此对 plications and Products.NY:McGraw Hill Database Ex- 象集合中的对象在装入时,先装入类的字节码, perts'Series,1994 然后生成新对象,并用JAVA的反射功能用持久2 Stanley Y,SuW.Association Algebra:A Mathematical 对象中的属性设置它的属性并加入到它的集合 Foundation for Object-oriented Database.IEEE Transac- 类中,同时凡是此对象可达的对象都被装入,以 tion on Knowledge and Data Engineering,1993,5(5):93 An Implementation Method of Object-relational Database Using JAVA Liu Oingwen,Yang Yang ABSTRACT JAVA language and the platform independence of JAVA virtual machine provide convience for new generation of object relation database.A principle and methdology of object relation database which persistences JAVA objects are presened according to Atkinson's orthogonal persistence theory and accesses persistent object set by assiciation set by calculating association operators. KEY WORDS object relation database;JAVA;persistence
刘 庆文等 语 言实现对 象 关 系数 据库 的方 法 · · 仓库几种 二 图 表示 了对象 的可 达关系 图 中 引 用 , 引用 , 引用 , 引 用 持久化 时要遍历 的引用链 并把 , , 都持久 化 同 时有 反 指针 来保正 完整性 在 端有表 , 来防止对象 的重复加入 当 同时持久化 , 时 , 必 须对 检查 , 若 己加入到 之 中则不 必 重 复加入 此 来完成 持久 对 象 的访 问 由于 是一 个 外 挂 的系统 , 不 是对 虚 拟 机进 行重 新开 发 , 因此 只 能持 久 对象 中的 属 性 , 对 于 和 属性无法 持 久化 一一一 一一一一洲 图 对象可 达关系图 的结果返 回到集合类型 , , 等 类 型之 中 应用程序用这些类 中的方法访 问集 合 中的个体元素 集合 中的元素并不在 端 , 使用 徽惰方法访 问持久对 象 , 即 只 有 当访 问到 该元 素 时才从 中装入此对 象 集合 中的对象在装入 时 , 先装入类的字节码 , 然 后 生 成新 对象 , 并用 的反射功能用 持久 对 象 中的属性设置 它 的属性 并加入到它 的集合 类 中 , 同时凡 是此对 象可 达 的对象都被装入 , 以 结论 在 对 象 关 系 数 据 库 的 研 究之 中 , 在 没 有 虚拟机之 前 , 对象 的方法 不 能持 久化也 不 能被访 问 产 生 之 后 , 借助 于 正 交持久 化 的理论可 以产生 带方法 的模式 , 按照 关联代数 的方法可 以用 集合化 的方法访 问持久对象和 它 的方法 , 加上 的跨平 台性可 以很 自然 的分 布到 网络 中 , 形成 网络对象关系数据库 , 这将优 于 以往 的系统 参 考 文 献 句 一 , , , , , , 一 ,