第九讲软件服务质量保障技术.ppt

上传人:本田雅阁 文档编号:3121651 上传时间:2019-07-13 格式:PPT 页数:197 大小:1.17MB
返回 下载 相关 举报
第九讲软件服务质量保障技术.ppt_第1页
第1页 / 共197页
第九讲软件服务质量保障技术.ppt_第2页
第2页 / 共197页
第九讲软件服务质量保障技术.ppt_第3页
第3页 / 共197页
第九讲软件服务质量保障技术.ppt_第4页
第4页 / 共197页
第九讲软件服务质量保障技术.ppt_第5页
第5页 / 共197页
点击查看更多>>
资源描述

《第九讲软件服务质量保障技术.ppt》由会员分享,可在线阅读,更多相关《第九讲软件服务质量保障技术.ppt(197页珍藏版)》请在三一文库上搜索。

1、第 九 讲 软件服务质量保障技术,一、公共服务 二、事务服务 三、安全服务 四、性能服务,内 容,一、公共服务,1、概念 2、公共服务的接口 3、公共服务的实现 4、公共服务的使用方式,公共服务是中间件提供的重要功能 用于对应用的约束性需求进行支持,1、概念,在所有的中间件规范中 公共服务 都是除协议、接口定义语言外的重要组成部分,DCE,线程,DCE,远程过程调用,时间,服务,命名,服务,其它基,本服务,分布式文件服务,其它服务,安,全,管,理,应用,DCE(Distributed Computing Environment),Object Services,Application Inte

2、rfaces,Domain Interfaces,Common Facilities,OMA:Object Management Architecture,DNA(Distributed Network Architecture),J2EE(Java 2 Platform, Enterprise Edition),设计,开发,与,管理,工具,标准技术与协议,资源层,控制器,数据,/,状态管理,通信服务,安全容器,/,模型,虚拟机,客户应用层,服务层,服务调用,服务容器,核心服务,服务提供接口(,SPI,),注册池,业务规则,/,工作流,EIS,数据库,遗留系统,消息队列,ECM,池,目录,l,

3、一致的对象与事件模型,l,一致的架构模型,SOA (Service Oriented Architecture),公共服务与构件,不同于单机环境下应用程序与程序库之间的关系: 公共服务基本上不实现应用系统的功能 也不会被链接到具体的应用系统中 程序库可以用于实现应用系统的功能 且往往被链接到应用系统中 类似于单机环境下程序模块与操作系统中系统调用之间的关系: 公共服务是网络环境中系统软件的一部分 系统调用是单机环境中系统软件的一部分 它们都可以独立运行,不依赖于具体的应用系统,公共服务的接口定义了公共服务的调用格式 公共服务接口的定义方法与构件的定义方法基本相同 例如:OMG不仅用IDL定义应

4、用对象 还用IDL定义公共服务 SUN采用Java语言的interface声明构件的接口 也用它来声明底层服务的接口,2、公共服务的接口,由于实现功能的复杂性 一个公共服务往往包含多个接口 分别用于代表公共服务内的一组有意义的操作 例如:OMG的命名服务包含两个接口: NamingContext BindingIterator SUN的JTA包含5个接口: UserTransaction TransactionManager Transaction Synchronization XAResource,公共服务的具体实现方式是十分丰富的: (1)公共服务可以在应用服务器内实现 (2)公共服务可

5、以由另外一个单独的中间件产品实现 (3)公共服务可以在局域网内的另一个应用服务器实现 这主要是因为在局域网内的许多资源需要统一管理 例如负载共享服务、命名服务、安全服务等等 (4)公共服务可以作为一种网络基础设施 在因特网范围内对各种应用服务器进行支持 在下一代因特网中这种趋势十分突出 许多公共服务被实现为网络的基础设施 例如:身份认证、主体标识等等,3、公共服务的实现,a,c,d,构件,容器,应用服务器,网络基础设施,b,公共服务的实现,如何向公共服务发出一条符合公共服务接口的消息 以最终实现功能约束 1) 代码直接调用式的使用方式 在应用程序代码中直接调用服务接口 存在使用直接、效率较高等

6、优点 也存在一些不足 例如:不利于程序代码的复用 不利于在运行过程中根据约束性需求的变化 调整具体的实现策略 这些不足可以通过声明式的使用方式克服!,4、 公共服务的使用方式,2) 后期声明式的使用方式 应用程序代码不直接调用公共服务 而是由容器(截取器)进行调用 容器调用的依据是应用系统开发人员 在系统组装或者部署阶段对应用程序的声明 这种声明可以是针对一个类进行的 也可以是针对一个具体的方法进行的 声明式的使用方式也存在一些不足 例如:效率有所损失,使用点受到限制等 实际过程中可以结合使用两种使用方式 以取得最满意的效果,二、事务服务,1、动因 2、事务概念及特性 3、并发控制 4、分布式

7、事务 5、JAVA 事务服务,1、动因,网络环境下故障的不可避免性: 通信媒介的局限性 硬件的可靠性变化 软件的潜在缺陷,硬件的可靠性变化:,时间,发生故障的概率,1,导致:电源停电、介质信息丢失等故障,浴盆曲线,逻辑越来越复杂 集成带来的特征交互越来越多,软件的潜在缺陷,导致:内存泄露、访问冲突、特征干扰等问题,如何面对错误?,在高层(操作层)进行处理,保持系统的正确性、完整性,例如:银行转帐系统,A,B,从银行A的帐号a向银行B的帐号b转帐 ¥10000.00 (1)将A的帐号a中的金额减 ¥10000.00 (2)将B的帐号b中的金额加 ¥10000.00,该过程中任何一个环节都可能出错

8、! 如何保证系统的可接受性?,访问冲突,网络环境下存在各种资源: 处理器 存储器 外部设备 数据库 软件构件 为提高资源利用率,往往允许许多客户能够访问它们 当它们同时访问同一资源时,访问冲突即可能发生 例如: 更新丢失(lost updates) 不一致的读取(inconsistent retrieval),更新丢失问题,存在3个银行帐号A、B、C 帐面金额分别为:¥1000,¥2000,¥3000 客户C1 从帐号A向帐号B转 ¥400 客户C2 从帐号C向帐号B转 ¥300 正常结束时 帐号A减少 ¥400 帐号C减少 ¥300 帐号B增加 ¥ 700 假如 C1、C2 同时访问 B(同

9、时读取、写回B的金额) 得到的结果可能是:帐号A减少 ¥400 帐号C减少 ¥300 帐号B增加 ¥400 C2的更新丢失了!,客户C1:从帐号A向帐号B 转 ¥400 将帐号A上的金额减 ¥400 将帐号B上的金额加 ¥400,客户C2:从帐号C向帐号B 转 ¥300 将帐号C上的金额减 ¥300 将帐号B上的金额加 ¥300,Balance:=A.read() ¥1000 A.write(balance -400) ¥600 balance:=C.read() ¥ 3000 C.write(balance-300) ¥ 2700 balance:=B.read() ¥2000 balanc

10、e:=B.read() ¥ 2000 B.write(balance + 300) ¥ 2300 B.write(balance + 400) ¥2400,结果:客户C2的更新操作被丢失,不一致的读取问题,存在3个银行帐号A、B、C 帐面金额分别为:¥1000,¥2000 ,¥3000 客户C1 从帐号A向帐号B转 ¥400 客户C2 计算三个帐号的总额 正常结束时 总额为 ¥6000 假如 C1、C2 同时操作 得到的结果可能是: 总额为 ¥5600 总额计算错误!,客户C1:从帐号A向帐号B转 ¥400 将帐号A上的金额减 ¥400 将帐号B上的金额加 ¥400,客户C2:计算三个帐号的总

11、额,Balance:=A.read() ¥1000 A.write(balance -400) ¥600 balance:=A.read() ¥ 600 balance:=balance+B.read() ¥ 2600 balance:=balance+B.read() ¥ 5600 balance:=B.read() ¥2000 B.write(balance + 400) ¥2400,结果:客户C2得到的帐号总额为 ¥5600,与实际总额不一致!,解决上述问题需要掌握如下信息: 该操作包括哪些低层操作? 这些低层操作涉及哪些持久数据? 这些操作的运行结果如何? 如果出现错误怎样处理?,类似

12、的问题已经出现在 数据库管理系统 分布式操作系统 等领域,解决该问题的关键概念:事务(Transaction),2、事务概念及特性,事务是一系列操作 它们 或者全部完成 或者全部不做,事务的ACID特性 事务的启动、提交与终止 事务的类别 事务的支持机制,(1)事务的ACID属性,Atomicity 原子性 Consistency 一致性 Isolation 分离性 Durability 持久性,原子性(Atomicity) 事务 或者被全部执行 或者任何修改都不起作用 事务的起点 是 回卷点 也是 重复执行的起点 事务的终点 是下一个事务的起点,共享的资源(的状态)需要保持一致 在下面情形中

13、容易产生不一致的状态: 多个并发事务在互相不知晓的情况下结束 应用系统 定义一致性,并负责保证一致性 如果事务不能解决不一致问题 事务可以被终止,一致性(Consistency),分离性(Isolation),每个事务访问资源时 任何其它事务的存在皆是透明的 在事务执行过程中 任何其它事务进行的修改皆是不可见的 通过下列途径实现: 两阶段锁 乐观并发控制,持久性(Durability),对于一个完成的事务 其结果总是持久的 尽管后来的事务可以进一步修改其结果的值 在事务结束之前 被修改的资源的状态必须被保存到持久存储体中 例如:磁盘 持续性RAM EPROM 等,Begin: 启动一个新事务

14、Commit: 结束一个事务 存储事务过程所做的修改 使得修改可以被其它事务访问 Abort: 结束一个事务 取消事务过程所做的所有修改,(2)事务的启动、提交与终止,Begin,Commit,Abort,(3)事务的类别 平坦的事务与嵌套的事务,平坦事务:Flat Transactions,Main Transaction,Call,Call,Call,Commit,Begin Trans.,Begin Trans.,Commit,Begin Trans.,Commit,Begin Trans.,Commit,嵌套事务:Nested Transactions,(4)事务的支持机制 单机环境下

15、:并发控制(2PL) 多机环境下:全局控制(分布式事务:2PC),3、并发控制,1)概述 2)两阶段锁(Two Phase Locking :2PL) 3)乐观并发控制(Optimistic Concurrency Control) 4)比较(Comparison),可串行化(Serializability) 避免死锁(Deadlock Freedom) 公平(Fairness) 并发粒度(Degree of Concurrency) 复杂度(Complexity),1)概述,评价并发算法的准则,2)两阶段锁,应用最广泛的并发控制技术 RDBMSs (Oracle, Sybase, DB/2,

16、 etc.) ODBMSs (O2, ObjectStore, Versant, etc.) Transaction Monitors (CICS, etc) 并发过程需要对共享的资源进行加锁控制 如果锁操作与当前资源的状态不冲突,可以得到锁控制 两阶段锁机制保证操作的可串行化,锁是一个标记,标明一个进程正在以某种模式访问一个资源 最小的锁模式为:读、写 锁被用来指示多个并发进程对某一资源的当前使用状态,加锁:Locking,进程在访问共享的资源之前,必须获得所有的锁 在访问共享的资源之后,必须释放所有的锁 2PL: 进程一旦开始释放锁,它再不能获取其它的锁 一个典型的 2PL 加锁过程为:,

17、所获得的锁 的数目,时间,锁的兼容性,进程是否能够获得锁取决于所请求的锁是否与资源目前的锁状态(其它进程已请求的锁)兼容 兼容性由锁兼容性矩阵决定 最小的锁兼容性矩阵:,Read,Write,Read,+,-,Write,-,-,锁冲突,如果所请求的锁与资源的锁状态不兼容,则不能获得所请求的锁 这被称为“锁冲突” 处理锁冲突的方法有: 强迫请求进程等待,直到冲突的锁被释放 告诉请求进程,无法获得所请求的锁,死锁,2PL 可能导致死锁状态 在该状态下,多个进程分别获取部分所需的资源,并互相等待其它进程释放资源 死锁必须通过终止一个或多个相关的进程才能得到解决 这需要被终止的进程放弃它们已经进行的

18、所有操作 解决死锁的核心在于避免死锁,锁粒度,2PL适用于任意粒度的资源 并发程度高的进程将需要小粒度的锁机制 小粒度的锁机制将导致需要较大数目的锁实现 这将导致系统开销的增加 因此,在实现具体系统时,需要在并发度与锁开销之间进行权衡 层次锁是其中的一种折中方案,层次锁,用于内部包含其它内容的资源 例如: 文件 (包含多条记录) 集合或序列 (包含对象) 锁状态增加了 intention read (IR) 与 intention write (IW) 用于标识资源祖先的状态 锁的兼容性:,R,w,IR,IW,R,+,-,+,-,w,-,-,-,-,IR,+,-,IW,-,-,+,+,+,+,

19、锁的透明性,谁请求锁? 并发控制基础设施 构件的实现体 构件的客户 第一种情形很好,但不易实现: 基础设施必须管理所有资源 基础设施必须掌握所有对资源的访问 最后一种情形是不期望的、需要避免的!,3)乐观并发控制,2PL的复杂度与被访问资源的数目呈线性关系 如果冲突发生的概率较小时,开销偏大 乐观并发控制的思路是: 进程首先修改资源状态的(逻辑)副本 验证并发进程之间的冲突 如果没有冲突:写回副本 否则:取消所有修改并重新开始,4)比较,共性: 都保证可串行化 需要一个取消过程 两阶段锁: 锁开销较大 可能出现死锁 在易于冲突时工作得好 乐观控制: 冲突概率小时开销小 不会出现死锁 在分布式系

20、统中冲突集合的计算复杂 时间同步开销较大,4、分布式事务,1)基本概念 2)两阶段提交,1)基本概念,分布式事务 是 涉及多个服务器(结点)的事务 例如:在不同银行之间进行转帐!,事务是一系列操作 它们 或者全部完成 或者全部不做,单机环境:,多机环境:,处理逻辑,单机控制机制,处理结点,单阶段提交(不加控制): 客户直接向各结点发出提交命令 如果某一结点提交失败则重复提交命令 不足: 客户发出命令时,结点无权力终止事务,问题:如何保证参与事务的各个结点 皆正确提交(Commit)?,解决方式: 基于单结点的并发控制机制 (每个结点保证本结点操作的事务性) 提供两阶段提交(two-phase

21、commit)机制,与分布式事务相关的分布式系统组成部分 可以被划分为如下三种角色: 事务性客户( Transactional Client ) 事务性服务器( Transactional Server ) 协调器( Coordinator ),事务性服务器,事务性客户,协调器,事务性客户,仅通过协调器获取与事务相关的具体操作内容 通过访问协调器 进行 事务的启动与提交动作 事务的实现 对于事务性客户是透明的 对于事务性客户而言,一个服务器是否是事务性的是透明的,分布式事务的启动者与提交者,事务性服务器,每个事务性服务器在事务协调器的控制下 访问、修改 资源 事务性服务器必须能随时访问协调器

22、事务性服务器必须在事务启动时向协调器注册 以便于协调器进行控制 事务性服务器必须实现事务协议(两阶段提交协议),分布式事务具体操作的执行者,协调器,实现分布式事务的关键部件 分布式事务协调者负责处理事务的 “开始”、“提交”以及“终止”操作 分布式事务协调器需要定位事务标识 不同的事务可以拥有不同的分布式事务协调器,分布式事务执行的控制者,Phase one: 投票(Voting) Phase two: 完成(Completion),2)两阶段提交,Phase One,投票阶段 协调器询问各服务器 是否能够(愿意)进行提交操作? 各个服务器回应: Yes: 表明可以根据指令进行提交 但尚不知道

23、是否真的将执行提交动作 No: 表明终止当前的操作 因此: 服务器可以 单方面地终止一个事务 但不能单方面地提交一个事务,Phase Two,完成阶段 协调器收集投票,并决策: 如果每个服务器皆投 Yes,则进行提交 如果任何一个服务器投 No,则进行终止 所有投 Yes 的服务器将接受到: DoCommit 命令,如果事务将被提交 Abort命令,如果事务不能被提交 各服务器提交自己包含的事务操作 并对“DoCommit ”命令给予回复(HaveCommitted),服务器的不确定时期,服务器在投“Yes”票后,处于能够提交,但不清楚是否必须提交的状态 该时间段被称为server uncer

24、tainty期 通常该时间段很短 协调器从接受到处理各投票的时间段 仍然可能存在故障(小概率事件),导致系统发生错误,两阶段提交的恢复,2PC启动(各服务器开始投票)之前发生的任何故障将导致“终止” 协调器在“提交决策”之前发生错误将导致“终止” 在该时刻之后(进行“提交决策”)发生故障,协调器将重启动(该过程中协调器保存了事务参与者的信息),然后,重新对所有提交消息进行决策 如果在投票之后、提交之前发生故障,服务器将在重新启动后,通知协调器重新计算投票结果 如果提交之后、回复之前发生故障,服务器将在重新启动后,向协调器发送 HaveCommitted 消息,Coordinator,serve

25、r,step status,step status,prepared to commit (uncertain),Prepared to commit (waiting for votes),committed,committed,done,1,2,3,4,Can commit?,yes,DoCommit,HaveCommitted,两阶段提交的过程:,5、JAVA 事务服务,1)EJB事务模型 2)JTA 3)EJB事务情景 4)构件提供者的责任 5)应用系统装配者的责任,1)EJB事务模型,EJB模型中的分布式事务服务涉及5个部分: 事务管理器:transaction manager 应用

26、服务器:application server 资源管理器:resource manager 应用系统: application program 通讯资源管理器: communication resource manager 通过实现相互之间的接口 它们共同完成事务过程,事务管理器 提供的服务与管理功能包括: 事务声明 事务性资源管理 同步 事务上下文传播 应用服务器 (或者是传统的 TP monitor) 提供事务处理的基础设施 以支持 应用的运行环境 (包括事务语句管理) 这样一个应用服务器的例子是EJB server,资源管理器 (通过一个资源适配器) 提供应用对资源的访问 资源管理器实现

27、一个事务资源接口 事务管理器通过该接口进行 事务关联 事务完成 及 事务恢复 工作 这样一个资源管理器的例子是 一个关系数据库服务器,事务性应用系统 依赖于应用服务器提供的事务属性声明 来提供事务管理支持 这样一个应用系统的例子是 利用EJB构件体系结构开发出来的应用系统 一些独立的Java 客户程序也希望 通过使用由 应用服务器 或事务管理器 提供的高层接口 声明事务边界 通讯资源管理器 向进入、发出的请求 提供 事务上下文传播 及访问事务服务 等功能,JTA 与 JTS,Java Transaction API (JTA) 是一个 事务管理器 与 参与分布式事务处理的其他部分 例如:应用系

28、统 资源管理器 应用服务器 等 之间的接口规范 Java Transaction Service (JTS) API 是 CORBA OTS规范的一个实现 提供了在服务器之间利用IIOP传播事务上下文的互操作 例如,一个EJB 服务器厂商可以使用一个 JTS实现 作为低层的事务管理器 EJB 体系结构不要求EJB 容器支持JTS 接口 EJB 体系结构要求EJB 容器支持JTA 接口,2)JTA,Java Transaction API 包含三部分: 一个高层应用系统事务声明接口: UserTransaction 由事务性客户使用 一个高层事务管理器接口 TransactionManager

29、Transaction Synchronization 由应用服务器使用 一个标准的X/Open XA 协议的JAVA 实现 XAResource 由事务性资源管理器使用,UserTransaction 接口,UserTransaction 接口向应用系统 提供控制事务边界的能力 可被Java 客户程序或者EJB 构件使用 其中,begin 方法 启动一个全局性事务 并将事务与调用者线程关联 transaction-thread关联 由事务管理器透明地管理,public interface javax.transaction.UserTransaction public abstract vo

30、id begin(); public abstract void commit(); public abstract int getStatus(); public abstract void rollback(); public abstract void setRollbackOnly(); public abstract void setTransactionTimeout(int seconds); ,interface javax.transaction.Status public final static int STATUS_ACTIVE; public final static

31、 int STATUS_COMMITTED; public final static int STATUS_COMMITTING; public final static int STATUS_MARKED_ROLLBACK; public final static int STATUS_NO_TRANSACTION; public final static int STATUS_PREPARED; public final static int STATUS_PREPARING; public final static int STATUS_ROLLEDBACK; public final

32、static int STATUS_ROLLING_BACK; public final static int STATUS_UNKNOWN; ,下面的代码段展示了一个构件管理事务的会话构件 对UserTransaction 的使用 / In the session beans setSessionContext method, / store the bean context in an instance variable SessionContext ctx = sessionContext; / somewhere else in the beans business logic Use

33、rTransaction utx = ctx.getUserTransaction(); / start a transaction utx.begin(); .do work / commit the work mit();,EJB服务器 中对 UserTransaction 的使用,如果应用服务器支持由事务性客户执行的事务声明 应用服务器必须支持客户程序通过JNDI方式获得 UserTransaction 对象应用 一个通过系统属性获得 UserTransaction 名字字符串的例子为: / get the system property value configured by admi

34、nistrator String utxPropVal = System.getProperty(“jta.UserTransaction”); / use JNDI to locate the UserTransaction object Context ctx = new InitialContext(); UserTransaction utx = (UserTransaction)ctx.lookup(utxPropVal); / start transaction work utx.begin(); do work mit();,事务性客户中对 UserTransaction 的使用

35、,TransactionManager 接口,TransactionManager 接口允许应用服务器 根据被管理应用系统的需求控制事务边界 例如:EJB容器为事务性EJB构件 管理事务状态 容器利用 TransactionManager 接口 声明事务边界 事务管理器将 与线程关联的事务上下文 作为其内部数据结构的一部分 进行维护 线程的事务上下文 或者为空 或者指向一个全局事务 多个线程可能同时与同一个全局事务关联,interface javax.transaction.TransactionManager public abstract void begin(); public abst

36、ract void commit(); public abstract int getStatus(); public abstract Transaction getTransaction(); public void resume(Transaction tobj); public abstract void rollback(); public abstract void setRollbackOnly(); public abstract void setTransactionTimeout(int seconds); public abstract Transaction suspe

37、nd() ; ,Transaction 接口 应用于 与目标对象关联的事务 的操作 当事务被创建时 每个全局事务皆被与一个事务对象关联 事务对象可被用于: 注册事务涉及的事务性资源 注册事务同步回调函数 提交或者卷回事务 获得事务的状态,Transaction 接口,由应用服务器进行资源登记的目的在于: 通知 事务管理器 资源管理实例参与该全局事务 这允许事务管理器通知参与的资源管理器 有关所执行工作的信息 使事务管理器将每个事务使用的资源进行分组 使事务管理器引导 事务管理器与资源管理器之间的 两阶段提交事务协议,interface javax.transaction.Transaction

38、 public abstract void commit(); public abstract boolean delistResource(XAResource xaRes, int flag); public abstract boolean enlistResource(XAResource xaRes); public abstract int getStatus(); public abstract void registerSynchronization(Synchronization sync); public abstract void rollback(); public a

39、bstract void setRollbackOnly(); ,synchronization 接口允许应用服务器 在事务提交之前与之后的时刻 获得从事务管理器发来的通知 对于每次事务启动,应用服务器都可能注册一个事务 Synchronization 回调将被事务管理调用的对象: beforeCompletion 方法在两阶段提交之前被调用 该方法在即将被提交的事务的上下文中执行 afterCompletion 方法在两阶段提交之后被调用 事务的状态以参数的方式被提供,interface javax.transaction.Synchronization public abstract vo

40、id beforeCompletion(); public abstract void afterCompletion(int status); ,XAResource 接口,.XAResource 接口是 基于X/Open CAE规范的XA 接口的Java 实现 XAResource 接口定义 资源管理器与 事务管理器 在分布式事务处理环境之间的契约 一个资源管理器的资源适配器实现XAResource 接口 以支持 全局事务与事务资源的关联 例如一个与关系数据库的连接,public interface javax.transaction.xa.XAResource public abstra

41、ct void commit(Xid xid, boolean onePhase); public abstract void end(Xid xid, int flags); public abstract void forget(Xid xid); public abstract int getTransactionTimeout(); public abstract boolean isSameRM(XAResource xares); public abstract int prepare(Xid xid); public abstract Xid recover(int flag);

42、 public abstract void rollback(Xid xid); public abstract boolean setTransactionTimeout(int seconds); public abstract void start(Xid xid, int flags); ,3)EJB事务情景,对多个数据库的更新,包含消息与数据库更新的事务,通过多个EJB服务器进行的数据库的更新,客户管理的事务声明,容器声明的事务声明,4)构件提供者的责任,Bean-managed 与 container-managed,当设计一个企业级构件时构件提供者必须决定 由构件在业务方法中声明

43、事务 (构件管理的事务声明) 还是由容器根据部署描述中的事务属性声明事务 (容器管理的事务声明) 一个会话构件或者消息驱动的构件 可以 被设计为bean-managed 的事务声明 或者 被设计为container-managed 事务声明 但同时只能是其中的一个 一个实体构件必须总是被设计为container-managed 事务声明,利用 bean-managed 事务声明的构件,一个有态构件实例可以 但不必须 在业务方法返回前提交一个启动的事务 如果一个事务在业务方法结束时还没有被提交 容器保持事务与实例之间的关联 直到实例最终完成事务 一个无态构件必须在事务方法返回前提交一个事务 一个

44、消息驱动的构件必须在onMessage方法返回前提交一个事务,public class MySessionEJB implements SessionBean EJBContext ejbContext; public void someMethod(.) javax.transaction.UserTransaction ut; javax.sql.DataSource ds1, ds2; java.sql.Connection con1, con2; java.sql.Statement stmt1, stmt2; InitialContext initCtx = new InitialC

45、ontext(); / obtain con1 object and set it up for transactions ds1 = (javax.sql.DataSource) initCtx.lookup(“java:comp/env/jdbc/Database1”); con1 = ds1.getConnection(); stmt1 = con1.createStatement(); / obtain con2 object and set it up for transactions ds2 = (javax.sql.DataSource) initCtx.lookup(“java

46、:comp/env/jdbc/Database2”); con2 = ds2.getConnection(); stmt2 = con2.createStatement();,例子:,ut = ejbContext.getUserTransaction(); / start the transaction ut.begin(); / Do some updates to both con1 and con2. The Container / automatically enlists con1 and con2 with the transaction. stmt1.executeQuery(

47、.); stmt1.executeUpdate(.); stmt2.executeQuery(.); stmt2.executeUpdate(.); stmt1.executeUpdate(.); stmt2.executeUpdate(.); / commit the transaction mit(); / release connections stmt1.close(); stmt2.close(); con1.close(); con2.close(); . ,public class MySessionEJB implements SessionBean EJBContext ej

48、bContext; public void someMethod(.) java.sql.Connection con1, con2; java.sql.Statement stmt1, stmt2; con1 = .; con2 = .; stmt1 = con1.createStatement(); stmt2 = con2.createStatement(); stmt1.executeQuery(.); stmt1.executeUpdate(.); stmt2.executeQuery(.); stmt2.executeUpdate(.); stmt1.executeUpdate(.); stmt2.executeUpdate(.); / release connections con1.close(); con2.close(); . ,利用

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1