拥有地理分散的子公司的企业,地理位置的分散造成了业务数据的分散,总公司与各分公司处于不同的城市或城市中的不同地区,在业务上它们除了处理各自的数据,也需要彼此之间进行数据的交换和处理。笔者论述了使用J2EE技术构建分布式数据库系统的框架模型。
分布式多层体系结构
J2EE(Java2 platform Enterprise Edition)是Sun提出的用于开发和部署三层结构企业级应用的平台,是一整套技术、规范的总称,包括建立企业应用系统的各个方面。使用j2EE技术能够快速建立可伸缩性企业应用系统,其目标是提供一个基于Java语言的服务器应用结构,支持平台独立、可移植、多用户、安全和标准的企业级应用。
J2EE技术的基础就是核心Java或Java 2平台的标准版,J2EE不仅巩固了标准版中的许多优点,如“编写一次到处运行”的特性,方便存取数据库的JDBC API、CORBA技术,以及能够在Internet应用中保护数据的安全模式等;同时还提供了对EJB(Enterprise JavaBeans)、Java ServletsAPI、SP(Java ServerPages)以及XML技术的全面支持。J2EE体系结构如图1所示。
图1:J2EE的体系结构 |
这种体系结构大致可以定义为客户机上的表示层、中间的业务逻辑层和后台的数据逻辑层。客户端可以先向运行在Web Server上的JavaServlet或者JSP发出请求,在JSP中嵌入Java的代码调用运行在EJB Server中的EJB,以实现商业逻辑。
EJB组件是J2EE的核心,它是基于Java RMI、HOP和JNDI技术,可以分为会话Bean、实体Bean和消息驱动Bean。
会话Bean代理客户端对服务器的请求,模拟商务过程,通过调用实体Bean获得数据,实现业务逻辑的处理流程。实体Bean用来模拟商务数据,是一种在数据存储层中的面向对象的一种内存中的视图和一种将数据持久化的功能和对象的封装性结合的机制,它对应多层应用体系结构中的数据存储层l2 J。
已存在的数据库系统映射到EJB结构可以通过BMP(Bean Managed Persistence)或CMP(ContainerManaged Persistent)完成。消息驱动Bean包含面向消息的逻辑,以及调用会话Bean的逻辑。使用EJB可以获得分布式事务管理、安全检查、资源管理和生命周期、持久性、远程访问能力和位置的透明性 。EJB与客户端及相互之间的交互如图2所示。
图2:EJB与客户及相互之间的交互 |
分布式数据库系统,是在逻辑上属于同一系统,但在物理上分散在计算机网络连接的多个场地(节点)的一组数据集。系统强调结点的自治性而不强调系统的集中控制,且系统应保持数据的分布透明性,使应用程序编写时可完全不考虑数据的分布情况。
EJB基于RMI/IIOP,具有天生的分布性,EJB容器可以为数据操作提供事务支持,所以可以利用EJB实现分布式数据库系统。
下面分析2种常用设计架构存在的缺陷,提出了使用J2EE实现的分布式数据库系统的架构设计,最后给出了一个设计模型。
两种架构设计方式及其缺点
架构设计方案1
![]() |
图3:架构1 |
如图3所示,每个Web服务器除了调用本地数据库外,还调用远程的数据库,将返回来的数据汇总后返回给客户端。此时逻辑代码分散在多个站点的多个Web服务器中,每个Web服务器的调用关系均不同,且当每增加一个数据库时,所有站点的Web服务器上的代码均要改变,加入对新的数据库的调用支持,造成了代码维护困难、可扩充性差、数据库调用逻辑不清晰,实际上形成了一种网状的调用关系。
例如如果新增一个DB4,DB1到DB3上的代码都要改变,增加访问DB4的代码,以提供对DB4的访问支持。
架构设计方案2
在架构1的基础上取消本地的Web服务器,将所有业务逻辑集中到一个Web服务器上,将会消除的网状调用关系,当增加一个新数据库时只需要更改中间的逻辑,从而提高了系统的可扩充性。架构2如图4所示。
图4:架构2 |
不同的客户端发出访问请求到同一个Web服务器,Web服务器自动区分客户端的来源,按其要求对分布于不同位置的数据源进行访问,汇总结果后返回给用户。
新增一个数据源只需要修改Web服务器上的业务逻辑,但是此时Web将各个分公司的本地数据库与远程数据库同样对待,因为客户端和存放业务逻辑的Web服务器不一定在本地。
当客户仅需要凋用本地数据时,仍然需要访问远程的Web服务器,由Web服务器访问客户的本地数据,再将其返回给本地客户。
链接
数据库技术对数据的收集、存储、处理和传播由集中式走向分布式、从封闭走向开放已在所难免。分布式数据库系统通过复制使系统具有适当的数据冗余,从而增加了系统的可靠性和可用性;提供局部自治的数据共享和场地之问的协调,从而使系统具有快速的数据处理能力。
![]() |
图5 |
![]() |
图6 |