仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 480|回复: 9
打印 上一主题 下一主题

[学习教程] JAVA编程:《Java事件计划战略》XA事件处置仓酷云

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:29:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
没有那个大公司会傻了吧唧用.net网页编程开发大型项目,开发了,那等于自己一半的生命线被微软握着呢。而.net网页编程不行,限制在window系统,又是捆绑,鄙视微软之!为了申明X/OpenXA接口在JTA事件办理中的主要性,和它利用的机会,我们之前一章提到的一段流动支出买卖的EJB代码为例:
  1. @TransactionAttribute(TransactionAttributeType.REQUIRED)publicvoidplaceFixedIncomeTrade(TradeDatatrade)throwsException{try{...Placementplacement=placementService.placeTrade(trade);executionService.executeTrade(placement);}catch(TradeExecutionExceptione){log.fatal(e);sessionCtx.setRollbackOnly();throwe;}}
复制代码
这段代码中,起首预置了一笔买卖,尔后实行买卖,这两个操纵变动了数据库中分歧的表。正如我们在后面章节看到的,假如在尺度的非XA情况,这段代码包管遵守ACID原则。假定我们收到了一个新的需求,该公司请求在每笔流动支出买卖时都向其他体系发送一条JMS动静,以存眷买卖举动。为复杂起见,我们一样假定在sendPlacementMessage()办法中完成一切的JMS动静逻辑。下面的例子被修正以下以完成新功效:
  1. @TransactionAttribute(TransactionAttributeType.REQUIRED)publicvoidplaceFixedIncomeTrade(TradeDatatrade)throwsException{try{...Placementplacement=placementService.placeTrade(trade);placementService.sendPlacementMessage(placement);executionService.executeTrade(placement);}catch(TradeExecutionExceptione){log.fatal(e);sessionCtx.setRollbackOnly();throwe;}}
复制代码
固然以上的修正充足复杂,这段代码却不会包管ACID原则。假如executeTrade()办法抛出了TradeExecutionException,数据库变动将会回滚,但买卖预置的动静将会被发送到JMS的queue或topic。现实上,买卖预置动静极可能在sendPlacementMessage()办法实行完成后就被queue或topic开释(消耗)失落了。
由于在非XA情况中,动静行列的拔出历程自力于数据库更新操纵,ACID原则中的原子性和自力性不克不及失掉包管,从而全体上数据完全性遭到伤害。我们必要的是,有一种体例可以让动静行列和数据库处于单一事件的把持之下,以致于两个资本能被和谐构成单一事情单位。利用X/Open的XA接口,我们便可以做到和谐多个资本,包管保持ACID原则。
XA接口详解

X/OpenXA接口是双向的体系接口,在事件办理器(TransactionManager)和一个或多个资本办理器(ResourceManager)之间构成通讯桥梁。事件办理器把持着JTA事件,办理事件性命周期,并和谐资本。在JTA中,事件办理器笼统为javax.transaction.TransactionManager接口,并经由过程底层事件服务(即JTS)完成。资本办理器卖力把持和办理实践资本(如数据库或JMS行列)。下图申明了事件办理器、资本办理器,和典范JTA情况中客户端使用之间的干系:

<br>
注重,上图中XA接口构成了事件办理器和资本办理器之间的通讯桥梁。由于XA接口的双向特质,XA撑持两阶段提交协定,我们将在本章的后续部分会商。
本章所叙说的内容很难掩盖XA接口的一切细节。假如读者体贴XA的细节,请参考X/OpenXA接口标准(可在http://www.opengroup.org/onlinepubs/009680699/toc.pdf经由过程pdf的格局拿到)。
甚么时分应当利用XA?

在Java事件办理中,经常使人狐疑的一个成绩是甚么时分应当利用XA,甚么时分不该利用XA。因为年夜多半贸易使用服务器实行单阶段提交(one-phasecommit)操纵,功能下落并不是一个值得思索的成绩。但是,非需要性的在您的使用中引进XA数据库驱动,会招致不成意料的成果与毛病,出格是在利用当地事件模子(LocalTransactionModel)时。因而,一样平常来讲在您不必要XA的时分,应当只管制止利用它。上面的最好理论形貌了甚么时分应该利用XA:
最好理论
仅在统一个事件高低文中必要和谐多种资本(即数据库,和动静主题或行列)时,才有需要利用X/OpenXA接口。

这里表现了一个主要的概念,即固然您的使用大概利用到多个资本,但仅当这些资本必需在统一个事件范围内被和谐时,才有需要用到XA。多个资本的情况包含会见两个或更多的数据库(其实不止是多个表,而是相互分隔的多个数据库),大概一个数据库加上一个动静行列,又大概是多个动静行列。您大概有一个使用同时利用到一个数据库和一个动静行列。但是,假如这些资本其实不在统一个事件中利用,就没有需要往用XA。本章入手下手的代码,预置一个流动支出买卖,尔后向行列发送一条动静,就是必要利用XA以便保护ACID特征的例子。
必要并利用XA最多见的场景是在统一个事件中和谐数据库变动和动静行列(或主题)。注重这两种操纵有大概在使用完整分歧的中央呈现(出格是在利用像hibernate如许的ORM框架的时分)。XA事件必需在回滚事务产生时和谐两品种型的资本,或让变动与其他事件坚持断绝。假如没有XA,送往行列或主题的动静乃至会在事件停止前抵达并被读取。而在XA情况下,行列中的动静在事件提交之前不会被开释。别的,假如是和谐一个操纵型数据库和一个只读数据库(即参考数据库),您就不必要XA。但是,因为XA撑持“只读优化”,当把一个只读数据源引进XA事件时,您大概其实不会看就任何的功能丧失。
当企图在您的企业Java使用中利用XA时,有几个隐含的成绩是必要思索的。这些成绩包含两阶段提交(2PC,two-phasecommitprocess),履历非常,和XA驱动的利用。以下章节分离胪陈了这些成绩。
两阶段提交

两阶段提交协定(Thetwo-phasecommitprotocol,2PC)是XA用于在全局事件中和谐多个资本的机制。两阶段协定遵守OSI(OpenSystemInterconnection,开放体系互联)/DTP尺度,固然它比尺度自己早多少年呈现。两阶段提交协定包括了两个阶段:第一阶段(也称筹办阶段)和第二阶段(也称提交阶段)。一个形貌两阶段提交很好的类比是典范的娶亲典礼,每一个介入者(娶亲仪式中的新郎和新娘)都必需从命布置,在正式步进婚姻生存之前说“我乐意”。思索有的杯具情况,“介入者”之一在做出答应前的最初一刻忏悔。两阶段提交之于此的了局同样成立,固然不具有那末年夜的损坏性。
当commit()哀求从客户端向事件办理器收回,事件办理器入手下手两阶段提交历程。在第一阶段,一切的资本被轮询到,问它们是不是筹办好了提交功课。每一个介入者大概回覆“筹办好(READY)”,“只读(READ_ONLY)”,或“未筹办好(NOT_READY)”。假如有恣意一个介入者在第一阶段呼应“未筹办好(NOT_READY)”,则全部事件回滚。假如一切介入者都回覆“筹办好(READY)”,那这些资本就在第二阶段提交。回覆“只读(READ_ONLY)”的资本,则在协定的第二阶段处置中被扫除失落。
因为XA情况中双向通讯的才能,两阶段提交变得大概。在非XA事件情况中,通讯仅仅是单向的,两阶段提交没法做到,这是由于事件办理器没法吸收到来自资本办理器的呼应。年夜多半事件办理器为了优化功能,尽快开释资本的目标,用多线程处置第一阶段轮询和第二阶段提交换程。下图展现了两阶段提交的基础流程:

<br>
下图展现了当资本办理器之一(DBMS)在第一阶段轮询时产生毛病的情形下两阶段提交的历程,

<br>
在这个示例中,一个提交哀求被运转全局事件(globaltransaction,一个运转于XA之下的JTA事件)的客户端发送到事件办理器。在第一阶段,第二个资本办理器回给事件办理器一个“未筹办好(NOT_READY)”呼应。在本例中事件办理器对一切介入者收回回滚哀求,因而和谐了在全局事件中的一切资本。
一些贸易的使用容器供应一种称之为“最初介入者撑持(LastParticipantSupport)”的特征,该特征有个别的的名字叫“最初资本提交优化(LastResourceCommitOptimization)”。“最初介入者撑持”同意非XA资本介入进全局事件。在“最初介入者撑持”下,当一个XA情况的提交哀求抵达事件办理器,事件办理器会起首对XA资本倡议第一阶段流程。一旦XA介入者发生的了局分歧前往,事件办理器随即对非XA介入者倡议提交(或回滚)的哀求。这个哀求的了局决意了两阶段提交换程剩下的事情怎样举行。假如对非XA资本的哀求乐成,事件办理器会倡议第二阶段,并对XA介入者倡议提交哀求。假如对非XA介入者的哀求不乐成,事件办理器会倡议第二阶段,并请求一切XA介入者回滚事件。
“最初介入者撑持”机制存在两个成绩。第一,它不是在使用容器间可移植的。第二,由于在第一阶段轮询历程和非XA最初介入资本提交之间有较长的工夫守候,您会发明在利用这一特征时产生履历非常(HeuristicException)的概率增添了(将会鄙人一节胪陈)。基于这些缘故原由,“最初介入者撑持”特征应当在一样平常情形下制止利用,除非心甘情愿。
年夜多半贸易使用服务器还撑持另外一个优化,称之为“一阶段提交优化(One-PhaseCommitOptimization)”。假如事件只包含一个介入者,第一阶段处置会被疏忽,单一的介入者被关照提交。在这类情形下,全部XA事件的成果取决于单一介入者的了局。
履历非常(HeuristicException)处置

在两阶段提交的历程,资本办理器大概会利用“履历化决议”的战略,大概提交,大概回滚它本人的事情,而不受事件办理器的把持。“履历化决议”是指依据多种外部和内部要素做出智能决意的历程。当资本办理器这么做了,它会向客户端报上一个履历非常(HeuristicException)。
所幸的是,履历非常并非出格罕见。它仅仅产生在XA情况下,做两阶段提交的过程当中,出格是事件介入者在第一阶段发生了呼应以后。履历非常最多见的缘故原由是第一阶段和第二阶段之间的超时情形。当通信提早或丧失,资本办理器也许要做出提交或回滚其事情的决意,以开释资本。不出料想,履历非常产生最频仍的时分恰是高资本使用工夫段。当您在使用中发明履历非常时,您应当查找是不是有事件超时成绩,资本锁定成绩,和资本利用过量成绩,这些成绩经常是履历非常的基本缘故原由。偶然收集提早或收集妨碍也会招致履历非常。一样的,如下面的章节所述,利用“最初介入者撑持”特征会招致履历非常更加频仍的产生。
JTA表露出的三种JTA履历非常为HeuristicRollbackException,HeuristicCommitException,和HeuristicMixedException。我们分离用上面的场景申明之:
场景1:在commit操纵阶段的HeuristicRollbackException非常
在此场景中,客户端在XA情况下实行更新操纵,向事件办理器倡议提交以后事件的哀求。事件办理器开启两阶段提交换程的第一阶段,随即轮询资本办理器。一切资本办理器向事件办理器呈报说它们已做好了提交事件的筹办。但是,在(两阶段提交换程的)第一阶段和第二阶段之间每一个资本办理器自力的做出了回滚它们已完成事情的履历性决意。当进进第二阶段,提交哀求被发送到资本办理器时,由于所做的事情已在此之前回滚了,事件办理器将会向挪用者呈报HeuristicRollbackException非常。
当承受到此类非常时,经常使用的准确处置体例是将此非常传回客户端,让客户端从头提交哀求。我们不克不及复杂的再次挪用commit哀求,由于对数据库发生的更新已随回滚操纵从数据库事件日记中删除。上面的序列图申明了这一场景:
第一步:第一阶段处置(筹办阶段)

<br>
第二步:在第一阶段和第二阶段之间

<br>
第三步:第二阶段处置(提交阶段)

<br>
正如您从序列图中看到的,两个资本办理器回滚了他们本人的事情,固然他们在第一阶段都向事件办理器呈报了READY的呼应。别忧虑这些非常因何产生,我们在后续章节会做深切切磋。
场景2:在commit操纵阶段的HeuristicMixedException非常
在此场景中,客户端在XA情况下实行更新操纵,向事件办理器倡议提交以后事件的哀求。事件办理器开启两阶段提交换程的第一阶段,随即轮询资本办理器。一切资本办理器向事件办理器呈报说它们已做好了提交事件的筹办。和第一种场景分歧的是,在第一阶段和第二阶段产生的间隙,有资本办理器(比方动静行列)做出了履历性的决意提交其事情,而其他资本办理器(比方数据库)做出了回滚的履历性决意。在这类情形下,事件办理器向挪用者呈报HeuristicMixedException非常。
这类情形下,十分难于选择准确的后续应对体例,由于我们不晓得哪些资本提交了事情,哪些资本回滚了事情。一切方针资本因而处于一种纷歧致的形态。由于资本办理器相互互不干涉的自力操纵,就履历性决意而言,他们之间没有任何和谐和通讯。办理这一非常一般必要人力参与。上面的序列图申明了这一场景:
第一步:第一阶段处置(筹办阶段)

<br>
第二步:在第一阶段和第二阶段之间

<br>
第三步:第二阶段处置(提交阶段)

<br>
注重在下面的图示中,一个资本办理器提交了它的事情,而其他资本办理器选择回滚其事情。在这类情形下事件办理器将会呈报HeuristicMixedException。
抵消息行列或主题利用XA

在XA接口下利用的资本必需完成javax.transaction.xa.XAResource接口,以便本人可以到场XA全局事件。关于JMS方针(行列或主题),这能够经由过程在特定的使用服务器把持台或办理程序中设置完成。真正激活XA的部分是JMS毗连工场(ConnectionFactory)。一旦JMS毗连工场撑持XA,发送给JMS行列或主题的动静在两阶段提交历程停止之前不会被开释。在没有XA的情形下,不管所处的事件高低文了局怎样,发送给JMS方针的动静会被当即开释,并可被吸收者拾取。
在WebLogic使用服务器中,可在办理把持台的Services|JMS|ConnectionFactories设置中激活XA的JMS毗连工场。在Transactions这个页面,有一个名为XAConnectionFactoryEnabled的选项,经过此能够将JMS方针包括到JTA全局事件中。关于IBMWebSphere,可在办理把持台的Resources|WebSphereJMSProviders|ConnectionFactories路径下选择利用XA的JMS毗连工场功效。勾上名为EnableXA的选择框就激活了XA的JMS毗连工场。
为数据库利用XA

可经由过程利用XA版的数据库驱动来使数据库撑持XA。因为XA版的数据库驱动一般比非XA的难用很多,一个忠言是不到不得已的时分别利用XA驱动。
利用XA版的数据库驱动常会招致不成预期且难于办理的毛病。比方,将非XA驱动交换为XA版驱动经常会发生难于跟踪的毛病。因而,应当在项目开辟和测试阶段尽早的引进XA驱动(,尽早表露成绩并办理之)。
在利用XA版的数据库驱动时,大概碰着的毛病品种包含当地事件毛病和嵌套事件毛病。当您在一个XA全局事件正在举行的过程当中试图开启新的事件,这些毛病就会发生。这类情况会在多个情况下产生,但最多见的情形是夹杂当地事件模子与声明式事件模子招致,和在XA情况下利用存储历程的情形。
当在XA情况下利用存储历程,在存储历程里挪用DDL(数据界说语句,如CREATETABLE,BEGINTRAN,ENDTRAN)常招致毛病。这是最频仍招致XA毛病的祸首罪魁,并很难修改。比方在Oracle中,利用XA时,您大概会看到上面的毛病信息:
  1. ORA-02089:COMMITisnotallowedinasubordinatesession
复制代码
假如利用非XA的数据库驱动,也许您不会看到这个毛病,由于DDL语句实行的时分JTA事件会停息。当看到这个毛病信息,标明了您的存储过程当中包括DDL代码,而且(由资本办理器办理的)当地事件实验提交它的事情。
一般要从存储过程当中删除既有的DDL语句是坚苦的,由于它们在那边必定有存在的来由,大概大概这些存储历程被其他使用所共享(,要删除它们牵涉面太年夜)。一个无效的绕开成绩的做法是,挪用这些存储历程之前,手工的停息事件;而在这些存储历程前往后,持续事件。利用这个技能会制止XA相干的当地和嵌套毛病。但是,假如如许做,存储历程做出的修正会自力于JTA全局事件提交,因而违反了事件的ACID特征。以是说,这类做法仅仅是绕开成绩,而不是办理成绩。上面的代码片断展现了此技能的细节:
  1. ...InitialContextctx=newInitialContext();TransactionManagertm=(javax.transaction.TransactionManager)ctx.lookup(“javax.transaction.TransactionManager”);TransactioncurrentTx=null;try{currentTx=tm.suspend();invokeSPWithDDL();}finally{if(currentTx!=null)tm.resume();}
复制代码
即使在声明式事件的情况下,我们仍旧可使用TransactionManager往用代码体例停息和持续事件。这个技能可以制止XA情况下的SQL非常信息,但它没有真实的办理成绩。——真正办理成绩的独一办法是在有关存储过程当中删除那些犯规的DDL语句,大概利用撑持嵌套事件的JTA事件服务。
总结

本章要表达的最主要的头脑是,了解甚么时分您真正必要利用XA版的数据库驱动。很多开辟职员和架构师老是保持要利用XA版的数据库驱动,固然现实上不存在利用它们的公道来由。假如您必要在统一个事件中和谐多个变动的资本(数据库、动静行列、主题,大概JCA),那末毫无疑问您必要引进XA接口。不然,万万避开XA。
另外一条关于利用XA的倡议是,碰着成绩时别总往推测您利用的是一个大概毛病百出的XA数据库驱动。成绩很有多是您的使用代码或事件处置逻辑酿成的,而非XA驱动。
关于作者

MarkRichards是IBM认证的初级IT架构师,他在IBM公司处置年夜型体系面向服务架构的计划和架构事情,利用J2EE与其他手艺,次要为金融行业服务。作者早在1984年起就到场软件行业,从开辟职员做起,直至计划师、架构师。他常常在出名论坛“NoFluffJustStuff”演讲,他从波士顿年夜学猎取了盘算机迷信硕士学位,持有SUN、IBM、BEA的多个Java与架构师认证。若有关于本书的批评或疑问,尽请接洽Mark。
本文选自迷你书《Java事件计划战略》的第五章,译者翟静。

但是一些大型开发或者是保密型比较高的项目都会用java,原因有2点,一:java是开源的,不怕别人留后门,偷我工具,.net网页编程就不一样了,保持微软的一向风格,源代码不公开
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-21 07:48:57 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
金色的骷髅 该用户已被删除
板凳
发表于 2015-1-28 06:00:33 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
精灵巫婆 该用户已被删除
地板
发表于 2015-2-4 15:54:01 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
透明 该用户已被删除
5#
发表于 2015-2-10 03:37:14 | 只看该作者
是一种突破用户端机器环境和CPU
只想知道 该用户已被删除
6#
发表于 2015-2-21 21:08:14 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
活着的死人 该用户已被删除
7#
 楼主| 发表于 2015-3-2 10:53:53 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
admin 该用户已被删除
8#
发表于 2015-3-11 03:18:09 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
小魔女 该用户已被删除
9#
发表于 2015-3-19 01:54:57 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
若相依 该用户已被删除
10#
发表于 2015-3-26 23:38:07 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 13:20

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表