分布式旅行预定系统_第1页
分布式旅行预定系统_第2页
分布式旅行预定系统_第3页
分布式旅行预定系统_第4页
分布式旅行预定系统_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1 分布式旅行预订系统概述21.1背景介绍21.2系统目标22 需求分析22.1 系统总体需求分析22.2 功能需求分析23 系统设计34 系统实现34.1 简单旅行预定资源管理器34.1.1 RM存储表44.1.2事务管理44.2.3 系统ACID属性44.2.4系统并发控制的封锁处理54.2分布式事务管理器64.2.1 事务管理器(TM)64.2.2 集中式2PC协议65 系统的运行与测试65.1 服务器端设置65.2 系统运行结果76 总结151 分布式旅行预订系统概述1.1 背景介绍旅行是人们生活中的重要部分。现今,旅行服务行业也在迅速发展,但是旅行业软件信息系统的使用效率上却又很

2、大的提升空间。观察现在旅行服务业,很少有一个服务系统能够高效智能的聚合包括飞机票预定、酒店旅馆预定、车租车预订等旅行必须的服务。1.2 系统目标项目目标是用java或VC组建一个分布式应用系统,它用来实施一个简单的旅行预定系统。2 需求分析2.1 系统总体需求分析旅行预订系统主要面向游客。通过调查,对于普通游客而言,随着旅游者越来越多地参与到旅游活动的前期决策与规划中,他们迫切地需要快速获得旅游目的地信息及其它相关服务设施信息,包括餐饮、住宿、交通、购物、娱乐等。此外,查询结果能够为游客提供最新的、现时性很强的旅游信息,要具有直观性、形象性,使游客全方位了解旅游目的地相关信息,在增加游客旅游兴

3、趣的同时也满足其个性化旅游的需求。2.2 功能需求分析基于总体需要分析,系统应包含:航班、旅馆、出租车、预订情况信息查询、航班、旅馆、出租车、游客信息增(修改、删除、查寻)、航班、旅馆、出租出的退票功能等。 信息查询该系统的信息查询模块主要实现航行信息、旅馆信息、出租车信息以及客户的航班预订信息的查询。 信息插入与删除因为航班、旅馆等信息是不断更新的,为此系统需要有信息增加、修改、删除等功能,该系统在功能上只需实现部分功能。信息的插入和删除主要包括航班信息(航班号、座位数等)、旅馆信息(地址、价格、房间数等)、出租车信息(地址、价格、数量等)的插入和删除,该部分功能只有管理员有相应的权限。 航

4、班预订与取消航班预订是指用户根据需求选择航班,同时还有旅馆和出租出可以进行选择,这里我们假设:1):只有一个航班,并且在给定的航班上所有的座位都是相同的价钱;2):所有的旅馆房间在同一个地方的都是相同的价钱。航班的预订和取消功能是该系统实现的关键部分。因为该部分需要对数据进行并发控制,保证数据的正确性。3 系统设计该系统可以通过两个阶段来实现系统: 做一个简单的资源管理器(RM)(一个简单的数据库系统包括一组固定的表和操作集合)支持具有ACID属性的并发事务。 实现一个工作流管理器(WC)和一个事务管理器(TM),能在各个资源管理者(RM)之间实现分布式事务处理。RMI是Enterprise

5、JavaBeans的支柱,是建立分布式Java应用程序的方便途径。运用RMI实现客户端、服务器的通信。利用Java.util.concurrent实现 Collection 框架对数据结构所执行的并发操作。本系统采用C/S框架结构。如下图3-1所示:Client Client Client ResourceManager(RM)Flights, Hotels,Cars, Customers图3-1 分布式旅行预订系统架构图4 系统实现4.1 简单旅行预定资源管理器实现一个简单的资源管理器(RM),支持具有ACID属性的并发交互事务。特别的,资源管理器储存关于:飞机票,租车,旅馆房间和旅客的数据

6、。多客户机通过接口界面并发访问资源管理器来查询和更新数据。要求资源管理器保证这些并发事务执行的正确性,例如,在有ACID要求的事务中。4.1.1 RM存储表资源管理器储存关于飞机票、租车、旅馆房间和旅客的数据。在该系统中资源管理器要储存下列的表:FLIGHTS (String flightNum, int price, int numSeats, int numAvail)HOTELS (String location, int price, int numRooms, int numAvail)CARS (String location, int price, int numCars, in

7、t numAvail)CUSTOMERS (String custName)RESERVATIONS(String custName, int resvType, String resvKey) 其中:flightnum是FLIGHTS的主键;location是HOTELS的主键;custNum是CUSTOMERS的主键;ESERVATIONS表包括一个对应的项目表,这张表由用户对航班,汽车,旅馆的预定信息组成;在FLIGHTS表中,numAvail是一个给定航班可以预定到的座位号。4.1.2事务管理在分布式数据库系统中,一个分布式事务及全局事务,通常由一个主事务和在不同站点上执行的子事务组成

8、。一般的,主事务负责事务的开始,提交和异常终止。(1)将事务划分成多个子事务,通过每个子事务来访问分布存储在多个站点的数据。(2) 协调在各站点子事务工作以达到系统的原子性。子事务不仅要与相应站点上并发执行的其他本地事务相互协调,还要与分布式系统中全局事务所产生的其他子事务相互协调。事务管理的目标就是负责当若干个事务并发执行和事务执行发生错误时,使数据库仍保持一致状态。所以事务管理至关重要,也是该系统中需要克服的难点。4.2.3 系统ACID属性在本系统中,每个服务器都按照总体的设计结构图,实现数据存储、更新、插入、删除、预定。同时,每个服务器实现本地的事务管理、并发控制。主服务器把一个事务分

9、为多个子事务,然后对各个站点处理子事物结果进行裁决,并发控制,实现分布式事务处理。原子性(Atomicity):Client向Server发出预订申请时,Server分别从每个服务器取得数据并进行交互式预订。如果每个服务器返回确认的信息,则再由Server统一进行Commit操作,否则如果有一个服务器返回预订失败的信息,然后由Server统一将每个服务器上试预订的信息进行rollback操作。一致性(Consistency):数据的不一致性主要是由于事物的并发、通信传输故障、站点故障导致。针对事物并发,可以对数据资源加锁和写锁。数据库始终是从一个一致性状态变到另一个一致性状态,只有成功事务系统

10、才会提交给数据库保存。隔离性(Isolation):事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。当某一资源被占用时,系统将给资源加锁,以保证事务不被干扰。持久性(Isolation):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。本系统采用记事本文件,然后把每个站点上的数据、操作日志存贮到记事本上。4.2.4系统并发控制的封锁处理并发控制是基于两阶

11、段锁协议的。特别的,当一个用户请求查询或更新信息时,资源管理器要保证适当的加锁,并且当一个事务提交或者撤销后要释放掉所有的锁。针对并发事务的冲突造成的丢失更新、不一致性以及破坏完整性约束,因此要对事务进行加锁。所以该系统中,采用主站点加锁法:1)采用主站点加锁法:选某一站点作为“主站点”,负责系统的加锁管理。所有站点都向这个主站点提出加锁请求,然后由主站点去处理加锁事宜,读锁一个,写锁全部,更新数据时必须保证所有站点上该数据的副本同样进行更改,更新结束后才能解锁。系统运用JAVA自带的java.util.concurrent.locks.ReentrantReadWriteLock来进行读写锁

12、枷锁private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();private final Lock r = rwl.readLock();/读硕private final Lock w = rwl.writeLock();/写锁2)加锁点:在server的线程reseverThead类在run()里对所需要的数据资源加写锁,采用一次性资源分配的方法,所以才预定之前,需要查询数据资源是否可用。如果其他事物需要访问被锁住的数据,必须等待锁释放。 在各资源站点的fix函数中加入写锁。如果其他事物需要访问被锁住的数据

13、,必须等待锁释放。 在各资源在commit()处理中,要把执行data = back.get(xid),需要加写锁。在查询数据的时候,需要读数据。插入数据和预定commit()操作要加锁。在插入数据后,可能会执行commit(),这样使得新增数据被覆盖了。public boolean fixFlight(int xid, String flightNum) Hashtable temp = new Hashtable();w.lock();3)预防死锁:一次加锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。4.2分布式事务管理器在项目中,我们将把数据表分布在几个RM中

14、,并在各个RM之间进行分布式事务操作。4.2.1 事务管理器(TM)TM支持下列操作:start,commit,abort,enlist.事务管理器是在各个不同的RM之间进行分布式事务的合作。当对一个RM提出请求时,将调用TM的enlist程序来告诉TM有一个事务。TM将对事务要使用到的RM做标记。工作流控制器将用户的start/commit/abort调用直接提交给TM来处理。用户所有其他的调用也将被交到适当的RM。4.2.2 集中式2PC协议在分布式事务的某一个代理指定为协调者,所有其他代理称为参与者。由协调者质问所有的参与者是否准备好提交事务。只有协调者才有掌握提交或者撤销事务的决定权,

15、而其他参与者各自负责在其本地数据库中执行写操作,并向协调者提出提交或者撤销子事务的意向。换而言之,如果有一个参与者投了“终止”票或在其规定时间内未对协调者做出响应,则协调者将命令所有的参与者终止事务。如果所有的参与者投了“提交”票,则协调者决策所有的参与者提交事务。在该系统中我们采用集中式2PC协议,在程序中表示为:if(flightFlag & carFlag & hotelFlag & reserFlag) 在投票表决阶段,协调者做出全局裁决,只有所有参与者都投了”提交“,然后协调者将执行的命令传输给参与者,由参与者做出相应的处理。5 系统的运行与测试5.1 服务器端设置根据分析,系统分为

16、主服务器(Server),航班服务器(FlightServer),宾馆服务器(HotelServer),出租车服务器(CarServer),用户服务器(CustomerServer)以及预订服务器(ResverServer)。客户端请求和server建立TCP连接(程序运行在本地):public login()HashSet set = null;try registry = LocateRegistry.getRegistry(,9999);stub = (ServerRemote)registry.lookup(Server);set = stub.getFlightNu

17、ms(); 服务器端口注册:registry = LocateRegistry.getRegistry(, 10000);flightStub=(FlightRemote) registry.lookup(flightServer);registry = LocateRegistry.getRegistry(, 10001);hotelStub = (HotelRemote) registry.lookup(hotelServer); 主服务器(Server)开启预订线程:ExecutorService threadPool=Executors.newSin

18、gleThreadExecutor();Futurefuture = threadPool.submit(new ReserveThread(xid,custName, flightNum, location,needCar,needRoom,);在启动预定线程时,要先运行carServer、flightServer、hotelServer、customerServer、reseverServer,然后再运行主server.ServerRemote主要来定义数据存储方式以及对航班、出租车、宾馆、等信息的插入删除操作,以及预订操作。而Server则实现了ServerRemote所提供的方法。Re

19、serveThread实现远程服务器注册,为每个单个服务器分配端口注册,调用call函数。5.2 系统运行结果(1)登录管理员账户(admin,123),由于该简易系统中管理员可以实现系统所提供的所有用户,所以系统以多个管理员身份登录实现并发访问。图5-1 登录界面图(2)系统主界面登陆验证后进入系统主界面,主界面提供查询信息、插入信息、删除信息、预订航班(包括航班的取消)四个主要功能。图5-2 系统主界面(3)查询功能提供信息查询功能。可以查询到航班、宾馆、出租车的票价、座位以及座位剩余等信息,来提供预订查询。下图未航班预订情况的查询情况。图5-3 查询界面查询功能的部分代码如下所示:if(

20、ae.getSource() = resvJB) String colNames = 姓名,类型,资料;String rowData = null;try TreeMap datas = stub.getResvInfo(); for(Iterator it=datas.keySet().iterator();it.hasNext();) String str = it.next(); rowDatai0 = datas.get(str).getCustName();if(datas.get(str).getResvType() = 1) rowDatai1 = 航班; else if(dat

21、as.get(str).getResvType() =2) rowDatai1 = 旅店; else if(datas.get(str).getResvType() =3) rowDatai1 = 出租车;rowDatai2 = datas.get(str).getDetail();i+;catch (Exception e) e.printStackTrace();(4)插入信息根据RM存储表格式添加航班、旅馆、出租车以及顾客信息。图5-4 航班等信息添加界面部分代码如下所示(不重要的省略部分)if (event.getSource() = jbFlight) if (jtFlightNum

22、.getText().equals()| jtFPrice.getText().equals() | ) JOptionPane.showMessageDialog(字段不能为空); else try if (result = true)JOptionPane.showMessageDialog(添加航班记录成功); else JOptionPane.showMessageDialog(添加航班记录失败catch (NumberFormatException e) (5) 删除信息系统删除信息界面:选择要删除的信息进行删除。图5-5 删除信息界面部分代码如下所示:public boolean

23、deleteFlight(String flightNum,int price,int numSeats)w.lock();try if (data.keySet().contains(flightNum) else finally w.unlock();if(event.getSource() = jbCust1) if(this.jtCustName.getText().equals() JOptionPane.showMessageDialog(字段不能为空); else tryboolean result1 = stub.deleteCustomer(jtCustName.getTex

24、t();if (result1 = true) JOptionPane.showMessageDialog(删除航班成功! else JOptionPane.showMessageDialog(删除航班记录失败 catch (NumberFormatException e) catch(RemoteException e) e.printStackTrace();(6)航班预订顾客通过查询,可以预订航班,并且选择是否需要出租车和宾馆。图5-6 航班预订界面当预定成功后服务器将显示是哪个客户订了什么票、出租车以及宾馆的信息,并显示预订成功。同时所对应的行办信息会发生相应的变化,剩余航班信息会更新

25、减少两张。如图5-7和图5-8所示:图5-7 航班CA1226预订情况图5-8航班CA1226剩余座位减少两张当资源不够时,提示预订失败。我们添加一个剩余座位为0的航班,进行测试。图5-9 航班预订失败部分代码如下所示:public boolean reserveItinerary() throws RemoteException,RuntimeExceptionExecutorService threadPool =Executors.newSingleThreadExecutor();Future future = threadPool.submit(new ReserveThread(xid, custName, flightNum, location, needCar, needRoom);try result = (Boolean)fu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论