一个轻量级的异构数据库同步系统

来源:岁月联盟 作者:李铁军 郝文宁 王 时间:2010-08-30
 摘  要  本文主要论述了通过Java语言、Hibernate框架和消息队列中间件实现异构数据库的同步。Java的平台无关性很好的地解决了平台问题,Hibernate作为一种新的ORM映射工具,可以支持几乎所有的流行的数据库服务器,所以它基本能满足对数据进行有效、安全处理的需要。同时通过MQSeries classes for Java,利用传输,能够实现数据的同步传输。     关键词   消息队列;  Hibernate;   异构数据库;  同步; 

1  引言

    目前,信息化建设正以前所未有的速度,各种各样的数据急剧膨胀。在这种大背景下,数据的传输、处理能力已经成为信息化程度的一个重要标志。但是,由于各单位现在使用的软硬件平台、数据库系统不尽相同,当各单位之间需要进行数据交流时,其效率及准确性、及时性必然受到影响,对数据进行有效、安全的传输和处理成为一个重要的技术课题。目前的一些解决方案系统功能复杂、过于庞大而且费用较高,而对于中小型一般只需要数据层的一部分进行同步。本文提出了采用Java、Hibernate框架和消息队列来实现异构数据库的同步方案,该方案是一种轻量级的架构,可满足中小型企业需求,并且能够以手工迁移的方式来保证网络出现故障时数据库的同步。

2  国内外发展状况

    异构数据库同步是异构数据库集成技术的一种应用。目前国内外几家大型的数据库厂商提出的异构数据库复制方案主要有:Oracle的透明网关技术,IBM的CCD表(一致变化数据表)方案,微软公司的出版者/订阅者方案。国外的如土耳其中东科技大学的MIND系统,美国密歇根-迪尔波恩大学、斯坦福大学的TSUNMMIS项目,国内的如中关村科技软件有限公司、华中科技大学的Panorama系统都有过类似系统的研究。但是由于上述系统致力于解决异构数据库间复杂的交互操作,大而全,并不符合一些中小企业的需求,如IBM的CCD表方案实现复杂且CD表占用资源较多维护费用高昂,微软公司的出版者/订阅者方案只能在NT运行等。而其它的系统大多都存在此类问题。

3  所用技术简介

3.1  Hibernate技术介绍

    Hibernate 是一个开源对象/与持久性和查询相关的框架,Hibernate 帮助基于普通的Java对象模型的持久对象的创建,从而允许持久对象拥有复杂的结构如混合类型、集合和属性,还可以拥有用户自定义的类型。现在这些持久对象可以有效的反映出底层数据库模式的复杂结构。为了提高效率,Hibernate包括了一些策略,如与数据库交互时的多重最优化,包括对象的缓存、有效外部连接的获取、必要时SQL语句的执行,并且Hibernate支持几乎所有流行的数据库服务器。

3.2  MQSeries classes for Java 简介  

    消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。下图1是消息队列本地通讯和远程通讯的原理图。
图1  MQ的工作原理    MQSeries classes for Java (MQ base Java) 允许以 Java 编程语言编写程序:     (1)作为 MQSeries 客户机连接到 MQSeries;    (2)直接连接到 MQSeries 服务器。    它支持 Java 小应用程序、应用程序以及小服务程序对 MQSeries 发出调用并查询。

4  解决方案

4.1  解决方案的主要框架图

    针对当前存在的这个问题,现提出基于Hibernate和消息队列来实现异构数据库间数据同步的方案,该方案是一种轻量级低成本的方案,可以满足中小企业对于异构数据库数据同步的需求。下面图2是整个解决方案的原理结构图:
图2  Hibernate+MQ实现异构数据库的数据同步    根据系统的工作特点,将系统工作模块分为下列四块,解决方案的主要模式图如图3所示。图 3  解决方案模式图

4.2 各模块设计简介

4.2.1  数据的捕获、分发、同步    数据的捕获是数据库同步的基础,变化数据的捕获主要有基于快照法、基于触发器法、基于日志法、基于API法、影子表法和控制表变化法。基于快照法效率比较低一般不能用于同步,可使用基于触发器法、基于日志法或基于API法和控制表变化法进行变化数据的捕获。    消息队列可以负责可靠的异步传输,将数据安全的发送至目的地。消息队列可以配置多种通讯模式(点对点通讯、多点广播、发布/订阅(Publish/Subscribe)模式、群集(Cluster)),可以适合多种不同的通讯需求。此外在同步过程发生冲突的话,消息队列还负责传递仲裁结果和控制信息,来负责协调整个系统。    同步是根据更新数据或仲裁结果来修改目标数据库,Hibernate 将更新数据持久化到数据库中。4.2.2  数据冲突与处理、刷新选时    所谓数据冲突是指在同一更新时间内,不同数据库节点的同步对象被更新,造成不一致性。在理论上这种冲突是无法避免的。对于此种情况的处理,主要有依据操作时间判定、依据数据库节点判定、优先级判定、依据数据库节点优先级判定、依据以上因素的权级算法判定等方案,情况比较复杂,本文不予以讨论。    选择用何种方式刷新数据库,决定了更新的频率。一般有下列三种方式进行刷新:定时刷新、请求刷新和即时响应刷新。4.2.3  实现的关键性技术    由于各种模块实现方法和需求不同,在具体实现中采用的具体方案有所不同,DB、Hibernate、消息队列相互配合实现了三个模块的功能,数据冲突与处理需要单独建立仲裁机制与消息队列协调实现,下面就一具体实现介绍一下该系统的关键性技术。     在捕获器中采用控制表法:在双方数据库中各增加一张表,表名为ModifyInfo,设八个字段:ID,TableName,KeyName, KeyValue,ModifyName,ModifyValue,Operation,ReadTag。
    其次对双方数据库中的每一张表指定一个触发器,在每次对源数据库的表进行insert,delete,update等操作时,该触发器负责往ModifyInfo表中插入一条记录。该记录的内容是进行操作的表名和主键,主键值,被修改的名称、被修改的值及操作的类型。然后根据数据库的结构建立需要进行数据同步的表的持久对象和配置文件(包含Hibernate3.0以上版本出现的XML映射配置),如果是几张或很多张相关联的表,则按照Hibernate对关联实体的访问进行映射。    Hibernate3.0以上版本出现了XML映射这一新特性,把无处不在的关系型持久性机制与日益增长的XML解决方案集成在一起。在OR(对象关系)持久性方面,Hibernate XML持久性是一个而然的解决方案。它可以跨越Hibernate支持的所有关系型平台(如虚拟的或真实的关系型平台)移动,允许自由的迁移对象、基于XML的应用程序和集成解决方案而不用担心下层的关系型实现方法。Hibernate利用dom4j框架组件进行XML的分析和维护。XML具有内容的自描述性、跨平台性、内容和显示分离、可扩展性等特点,为数据访问和交换提供了新的模式,为数据的拓展应用提供了方便。数据的转换流程如下:    当对源数据库中的表进行操作时,触发器在ModifyInfo表中插入更改信息,当要刷新数据库时,Hibernate以DOM4J实体模式将ModifyInfo读出生成一棵XML树,并利用ModifyInfo中的信息将变化的数据项找出同样以DOM4J实体模式读出生成XML树,并转换成XML文件关键性代码如下:Session s = session.getSession(EntityMode.DOM4J);//规定session的操作模式 List results = s.createQuery("from ModifyInfo").list();//把ModifyInfo从数据库中读出 Iterator result = s.createQuery("from " + tbname + " where " + kvalue).iterate();//将变化数据项从数据库中读出 Iterator i = obj.iterator();                   while (i.hasNext()) {                            outcurrent++;                            Element e = (Element) i.next();                            if (e != null) {                                     root.add(e);                            }//生成XMl树 XMLWriter writer = new XMLWriter(new FileWriter(url+ ".xml"), format);writer.write(doc);writer.close();//生成XML文件     然后把ModifyInfo和该条记录的XML文件通过消息队列担任分发的任务,把文件发送到指定的接受方的机器上,当文件发送完毕后,接收方将通过消息队列客户端从指定的队列中接收文件,通过上述操作的反序列操作,通过ModifyInfo找出所要更新的记录,把该条更新记录持久化为PO。如果该表是跟其他表关联的表,则我们对它进行修改时,其关联实体的相关记录也会进行相应的修改。

5  前景展望小结

    本文旨在为中小异构数据库间同步数据提供一种轻量级的解决方案,本系统设计简单,具有良好的跨平台性,可以安全有效的实现数据库间数据交互。中小企业可根据数据库间不同差异来制定捕获器方案,可以配置不同的发送模式,系统的可扩展性非常强大。在异常,无法进行消息队列传输时,可以手工将文件导出,迁移到目的数据库,保证了企业信息的安全。在数据维护方面,单纯的XML文件管理简洁方便,维护费用低廉。综上所述,在中小企业应用中前景广阔,具有非常强的吸引力。

[1] 孙卫琴 编著.《精通Hibernate:Java对象持久化技术详解 》.出版社[2]Hibernate中文站:http://www.hibernate.org.cn[3]《Hibernate3_reference》[4]IBM文档库: views/websphere/articles.jsp [5]SourceForge.Net: http://sourceforge.net/projects/dom4j收稿日期:2007-04-05   修订日期:2007-04-09

图片内容