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

下载本文档

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

文档简介

1、目录1 分布式旅行预订系统概述 11.1 背景介绍 11.2 系统目标 12 需求分析 12.1 系统总体需求分析 12.2 功能需求分析 13 系统设计 24 系统实现 24.1 简单旅行预定资源管理器 24.1.1 RM 存储表 34.1.2 事务管理 3423系统ACID属性34.2.4 系统并发控制的封锁处理 44.2分布式事务管理器 54.2.1 事务管理器( TM) 54.2.2集中式2PC协议 55 系统的运行与测试 55.1 服务器端设置 55.2 系统运行结果 66 总结 141 分布式旅行预订系统概述1.1 背景介绍旅行是人们生活中的重要部分。 现今, 旅行服务行业也在迅速

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

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

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

5、流管理器 (WC)和一个事务管理器(TM ),能在各个资源管理者(RM)之间实现分布式事务处理。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。运用RMI实现客户端、服务器的通信。利用Java.util.concurrent实现Collection框架对数 据结构所执行的并发操作。本系统采用C/S框架结构。如下图3-1所示:图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, int numAva

7、il)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) :持久性是指一个事务一旦被提交, 它对数据库中数据的改变就是永久性的, 接下来的其他操作和数据库故障不应该对其有任何影响。在事务完成以后, 该事务对数据库所作的更改便持久的保存在数据库之中,

11、 并不会被回滚。 本系统采用记事本文件, 然 后把每个站点上的数据、操作日志存贮到记事本上。4.2.4 系统并发控制的封锁处理并发控制是基于两阶段锁协议的。 特别的, 当一个用户请求查询或更新信息时, 资源管 理器要保证适当的加锁,并且当一个事务提交或者撤销后要释放掉所有的锁。针对并发事务的冲突造成的丢失更新、 不一致性以及破坏完整性约束, 因此要对事务进 行加锁。所以该系统中,采用主站点加锁法:1)采用主站点加锁法:选某一站点作为 “主站点 ”,负责系统的加锁管理。 所有站点都向这个主站点提出加锁请 求,然后由主站点去处理加锁事宜, 读锁一个,写锁全部,更新数据时必须保证所有站点上 该 数据

12、的 副本 同样进 行更 改,更 新结 束后才 能解锁 。系 统运用 JAVA 自带 的 java.util.concurrent.locks.ReentrantReadWriteLock 来进行读写锁枷锁private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();private final Lock r = rwl.readLock();/ 读硕private final Lock w = rwl.writeLock();/ 写锁2)加锁点:在 server 的线程 reseverThead 类在 run()

13、里对所需要的数据资源加写锁,采用一次性 资源分配的方法, 所以才预定之前, 需要查询数据资源是否可用。 如果其他事物需要访问被 锁住的数据,必须等待锁释放。 在各资源站点的 fix 函数中加入写锁。如果其他事物需要访问被锁住的数据,必须 等待锁释放。 在各资源在 commit() 处理中,要把执行 data = back.get(xid) ,需要加写锁。 在查询数据的时候,需要读数据。插入数据和预定 commit() 操作要加锁。 在插入数据后, 可能会执行 commit() ,这样使 得新增数据被覆盖了。public boolean fixFlight(int xid, String fli

14、ghtNum) Hashtable temp = new Hashtable();w.lock();3) 预防死锁:一次加锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否 则就不能继续执行。4.2 分布式事务管理器在项目中,我们将把数据表分布在几个 RM 中,并在各个 RM 之间进行分布式事务操 作。4.2.1 事务管理器( TM )TM 支持下列操作: start,commit,abort,enlist.事务管理器是在各个不同的 RM 之间进行分布式事务的合作。当对一个 RM 提出请求时,将调用 TM 的 enlist 程序来告诉 TM 有一个事务。 TM 将对 事务要使用到的 RM

15、 做标记。 工作流控制器将用户的 start/commit/abort 调用直接提交给 TM 来处理。用户所有其他的调用也将被交到适当的 RM 。4.2.2 集中式 2PC 协议在分布式事务的某一个代理指定为协调者, 所有其他代理称为参与者。 由协调者质问所 有的参与者是否准备好提交事务。 只有协调者才有掌握提交或者撤销事务的决定权, 而其他 参与者各自负责在其本地数据库中执行写操作,并向协调者提出提交或者撤销子事务的意 向。换而言之, 如果有一个参与者投了 “终止 ”票或在其规定时间内未对协调者做出响应,则 协调者将命令所有的参与者终止事务。 如果所有的参与者投了 “提交 ”票,则协调者决策

16、所有 的参与者提交事务。在该系统中我们采用集中式 2PC 协议,在程序中表示为:if(flightFlag & carFlag & hotelFlag & reserFlag) 在投票表决阶段,协调者做出全局裁决, 只有所有参与者都投了 ”提交 “,然后协调者将 执行的命令传输给参与者,由参与者做出相应的处理。5 系统的运行与测试5.1 服务器端设置根据分析,系统分为主服务器(Server),航班服务器(FlightServer),宾馆服务器(HotelServer), 出租车服务器(CarServer),用户服务器(CustomerServer)以及预订服务器(ResverServer)。客

17、户端请求和server建立TCP连接(程序运行在本地):public login()HashSet set = null;try registry = LocateRegistry.getRegistry(,9999);stub = (ServerRemote)registry.lookup(Server);set = stub.getFlightNums();服务器端口注册:registry = LocateRegistry.getRegistry(, 10000);flightStub=(FlightRemote) registry.lookup(fli

18、ghtServer);registry = LocateRegistry.getRegistry(, 10001);hotelStub = (HotelRemote) registry.lookup(hotelServer);主服务器 (Server) 开启预订线程:ExecutorService threadPool=Executors.newSingleThreadExecutor();Futurefuture = threadPool.submit(new ReserveThread(xid,custName, flightNum, location,needCar,n

19、eedRoom,);在启动预定线程时,要先运行carServer 、 flightServer 、 hotelServer 、 customerServer、reseverServer, 然后再运行主 server.ServerRemote 主要来定义数据存储方式以及对航班、 出租车、 宾馆、 等信息的插入删除 操作,以及预订操作。而 Server 则实现了 ServerRemote 所提供的方法。ReserveThread实现远程服务器注册,为每个单个服务器分配端口注册,调用call函数。5.2 系统运行结果(1)登录管理员账户 (admin,123) ,由于该简易系统中管理员可以实现系统所

20、提供的所有用户,所以系统以多个管理员身份登录实现并发访问。图5-1登录界面图(2)系统主界面登陆验证后进入系统主界面,主界面提供查询信息、插入信息、删除信息、预订航班(包 括航班的取消)四个主要功能。图5-2系统主界面(3)查询功能提供信息查询功能。可以查询到航班、宾馆、出租车的票价、座位以及座位剩余等信息, 来提供预订查询。下图未航班预订情况的查询情况。旅游相关(言皂重询1二酉店3.岀用车4顾容5预订第讨姓宕塑型资料季四航班ZH1861孝四旅店广卅李四出租车广州马六航班CA1226旅店广州出租车广州图5-3查询界面查询功能的部分代码如下所示:if(ae.getSource() = resvJ

21、B)String colNames = 姓名,”类型,资料;Stri ng rowData = n ull;tryTreeMap datas = stub.getResvI nfo();for(Iterator it=datas.keySet().iterator();it.hasNext();)Stri ng str = it .n ext();rowDatai0 = datas.get(str).getCustName();if(datas.get(str).getResvType() = 1) rowDatai1=航班; else if(datas.get(str).getResvTyp

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

23、rice.getText().equals() |)JOptionPane.showMessageDialog(” 字段不能为空”);else try if (result = true)JOptio nPa ne.showMessageDialog(” 添加航班记录成功); elseJOptio nPa ne.showMessageDialog(” 添加航班记录失败” catch (NumberFormatExcepti on e) (5)删除信息系统删除信息界面:选择要删除的信息进行删除。删除信吕MHie38BF-S飞机龛馆岀租车顾睿图5-5删除信息界面部分代码如下所示:public bo

24、olean deleteFlight(String flightNum,int price,int numSeats)w.lock();try if (data.keySet().contains(flightNum) else fin ally w.u nl ock();if(eve nt.getSource() = jbCust1) if(this.jtCustName.getText().equals() JOptionPane.showMessageDialog(” 字段不能为空”); else tryboolea n result1 = stub.deleteCustomer(jtC

25、ustName.getText();if (result1 = true) JOptionPane.showMessageDialog(” 删除航班成功! else JOptionPane.showMessageDialog(” 删除航班记录失败 catch (NumberFormatExceptio n e) catch(RemoteExcepti on e) e.pri ntStackTrace();(6)航班预订顾客通过查询,可以预订航班,并且选择是否需要出租车和宾馆。图5-6航班预订界面当预定成功后服务器将显示是哪个客户订了什么票、出租车以及宾馆的信息,并显示预订成功。同时所对应的行办

26、信息会发生相应的变化,剩余航班信息会更新减少两张。 如图5-7和图5-8所示:图5-7航班CA1226预订情况图5-8航班CA1226剩余座位减少两张当资源不够时,提示预订失败。我们添加一个剩余座位为0的航班,进行测试。图5-9航班预订失败部分代码如下所示:public boolean reserveltinerary()throws RemoteException,RuntimeExceptionExecutorService threadPool =Executors. newSi ngleThreadExecutor();Future future = threadPool.submit (newReserveThread(xid, custName,flightNum, locatio n, n eedCar, n eedRoom);try res

温馨提示

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

评论

0/150

提交评论