`
xzliulin
  • 浏览: 57087 次
  • 性别: Icon_minigender_1
  • 来自: 江苏徐州
社区版块
存档分类
最新评论

使用 JOTM 向 Servlet 添加事务

    博客分类:
  • JSP
阅读更多

简介
  J2EE 除了提供了 servlet 之外,还提供了大量的其它功能。Servlet 开发者们也许难得使用这些功能,不情愿也没有时间用一个超出所需的大型 J2EE 服务器来替换自己的简单的 servlet。然而,依据J2EE 的模块化特征,有可能将负责特定 J2EE 功能的小组件整合到 servlet 容器里,以此来增强 WEB 应用程序。其中之一就是事务。
  有关 J2EE 事务的完整描述,您可以参考three ONJava articles。现在只需知道事务是资源的操作步骤(例如:数据库),它由四个属性定义,这四个属性根据其首字母浓缩为 ACID:
  
  原子性
  事务的操作,或者是全部成功(此时提交事务),或者是全部不成功(此时回滚事务),谓之为 all-or-nothing 属性。一个事务应该被视为单个工作单元,在一个事务里面绝对不可能同时存在完成了的和没有完成的操作。
  
  一致性
  完成了的事务将资源从一个有效状态转变为另一个有效状态。一致性的具体例子有:数据库的参照完整性和表中的主键唯一性。
  
  独立性
  在事务没有提交之前,事务作用的共享资源的改变在事务之外是不可见的。独立性确保了不同事务不会同时访问正在更新的数据。
  
  持久性

so.bitsCN.com网管资料库任你搜


  由事务提交的改变会永久存在。
  JOTM (Java Open Transaction Manager)是由ObjectWeb协会开发的功能完整的且资源开放的独立的事务管理器。它提供了 JAVA 应用程序的事务支持,而且与 JTA( JAVA 事务 API)兼容。您可以在JOTM home page了解到更多的详细信息。在 TOMCAT(或其它 Servlet 容器)整合了 JOTM 后,JSP 和 servlet 的开发者们就可以获得事务的优势轻而易举的创建更多健壮的 web 应用程序。
  为了突出事务是怎样增强 web 应用程序的,举一个常用的例子, web 浏览器与客户端交互的 ATM 。
  
  ATM 样例:
  情景
  此例比较简单:一个客户想从 ATM 提款,输入了他的客户名称,john_doe;想提款数,$50。如果他的银行帐户上有足够的钱并且在 ATM 机上有足够的现金的话,应用程序就能给他相当数目的现金,并从银行帐户上提出同样的数目。否则,操作中断,并且除出现错误信息之外,其他都不会改变。我们无需担心安全问题,只是在猜想用户是否正确授权。
  这是一个非常简单的例子,但是如果不使用事务,用别的方法执行起来将会很难。客户端操作将会涉及到两个不同的资源:ATM 和客户银行帐号。它们会自动的在应用程序设计中产生 ACID 问题。例如:如果在 ATM 上操作成功而在银行帐户上却失败(也许是因为交流失败),客户将会取到钱,但是他的帐户将不会更新。对于银行来说,这就亏大了。

dl.bitsCN.com网管软件下载


  更糟的是,如果银行帐户更新了,但是由于一个错误阻止 ATM 传送钱,客户得不到现金,但是帐户上却提掉了这笔款。
  为了防止出现上述事故,在你的应用程序里,你能够 1) 联系两个资源,并告知两者客户执行的所有当前操作,2) 询问两者是否能执行操作,3)如果两者都同意,则请求操作。即使这样,此方法也不能谓之足够健壮,因为,如果客户帐户上的钱在第二步和第三步的时候被另外一操作提走,提款可能会失败,例如,客户帐户不能出现逆差。
  事务能使应用程序更简单更健壮的之处就是:在同一事务的两个资源上执行所有的操作的时候,它将会解决 ACID 的问题(尤其是原子性)。
  应用程序设计
  
  数据层
  在数据层,有两个不同的数据库,并各自有一张表。为了使例子更接近实际,我们使用两个不同的数据库,因为有可能从 ATM 提走不是属于该客户帐户的款(请参见下文配置数据库)。
  • banktest 包含代表客户帐号的 account 表。
  • atmtest包含代表 ATM 的 atm 表。
  
  逻辑层
  在逻辑层,有三个类来访问资源和执行操作:
  • foo.BankAccount 代表给定客户的银行帐号 account,并能通

www.bitsCN.net中国网管博客


  
  过 JDBC在 account 执行数据库操作。
  • bar.ATM 代表 ATM,并在 atm 表上执行 JDBC 操作。
  • bar.CashDelivery 使用前面两个类来执行一个客户操作。
  所有逻辑在 CashDelivery.java 的 deliverCash 方法中实现。
  javax.transaction.UserTransaction 接口用于划分事务所有 utx.begin() 和 utx.commit() (或 utx.rollback())之间的操作在同一事务内执行。这确保了应用程序不会受到如前述的遭遇。
  事务使得应用程序更为简单,由以下简单的步骤组成:
  1. 开始事务。
  2. 联系客户的银行帐户并从帐户上提款。
  3. 告诉 ATM 传送钱。
  4. 完成事务。
  o 如果所有事件完成,提交事务。
  o 否则,回滚事务。
  5. 报告客户事务结果。如果事务成功,现金将被提出,钱数也将从帐户上提出。否则,一切都不会改变。
  例 1。. CashDelivery.java
  public boolean deliver(String client, int value) {
  InitialContext ctx     = new InitialContext();
  UserTransaction utx = (UserTransaction)
  ctx.lookup("java:comp/UserTransaction");
  
  ...
   bitsCN全力打造网管学习平台
  boolean success = false;
  try {
  // 开始事务
  utx.begin();
  
  //联系客户银行帐户...
  BankAccount account = new BankAccount(client);
  
  // ... 从帐户上提款
  account.withdraw(value);
  
  //联系 ATM...
  ATM atm = new ATM();
  
  // ... 传送现金给客户
  atm.deliverCash(value);
  
  //一切正常
  success = true;
  
  } catch (Exception e) {
  // 出现故障,不得不
  // 报告给客户
  explanation += e.getMessage();
  
  } finally {
  try {
  if (success) {
  /*一切正常提交事务
  直到现在,钱才真正的从帐户上提出,并且将现金传送给客户。
  */
  utx.commit();
  
  } else {
  /* 出现故障,就回滚事务。
  *所有在事务内处理的操作不会发生。
  */
  utx.rollback();
  }
  } catch (Exception e) {
  /* 在完成事务的过程中出现故障,
  *仍旧保证
  * 事务内的操作不会发生。/
  */
  // 报告给客户
  explanation += "\n" + e.getMessage(); 需要什么来搜一搜吧so.bitsCN.com
  
  //最后,事务不会成功
  success = false;
  
  } finally {
  return success;
  }
  }
  }
  表示层
  在表示层,就用程序由两个 JSP 文件组成:
  • atm.jsp, 应用程序,它发送给bar.CashDelivery 类客户登录和提款数目,并显示客户操作的结果 。
  • admin.jsp,,用于显示和更新两个资源的信息。(它不属于应用程序设计的部分,但是添加它来简化资源更新,比如处理客户帐户的钱数。)
  
  配置数据库
  关于数据库,建议使用 MySQL 4.0.12 和相应的 JDBC 驱动程序。默认情况下,MySQL 表不会受影响。为支持事务,表在创建的时候设置为 InnoDB 类型。另外,为启用 InnoDB 类型,您可以将 MySQL 配置文件内的 #skip-innodb 行注释掉。
  
  已配置了一个 MySQL 的例子,用户名为 javauser,密码为 javadude。确保该用户已被创建并且拥有创建数据库的权限。
  创建数据库和表的脚本在 scripts/ 目录下的 example file 内含有。它将创建一个 account 表并插入两个客户:
  • john_doe 他的帐户金额为 $100。
  • jane_doe 他的帐户金额为 $600。

www.bitsCN.net中国网管博客


  例2 创建 account 表
  mysql> CREATE DATABASE banktest;
  mysql> USE banktest;
  mysql> CREATE TABLE account(
  -> client VARCHAR(25) NOT NULL PRIMARY KEY,
  -> money INT) TYPE=InnoDB;
  mysql> INSERT INTO account valueS("john_doe", 100);
  mysql> INSERT INTO account valueS("jane_doe", 600);
  mysql> SELECT * FROM account;
  +----------+-------+
  | client  | money |
  +----------+-------+
  | john_doe |  100 |
  | jane_doe |  600 |
  +----------+-------+
  脚本还会创建有 $500 可用现金的 atm 表。
  例3 创建 atm 表
  mysql> CREATE DATABASE atmtest;
  mysql> USE atmtest;
  mysql> CREATE TABLE atm(
  -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  -> cash INT) TYPE=InnoDB;
  mysql> INSERT INTO atm valueS(null, 500);
  mysql> SELECT * FROM atm;
  +----+------+
  | id | cash |
  +----+------+
  | 1 | 500 |
  +----+------+
  最后,复制 $CATALINA_HOME/shared/lib 内的 JDBC 驱动程序 .jar 文件。

dl.bitsCN.com网管软件下载


  获取并安装 TOMCAT
  本章主要介绍 Tomcat 4.1.18 及以上的版本。首先确保没有使用以前的旧版本,安装 TOMCAT 没有什么特别,只需下载并解压缩即可。
  获取并安装 JOTM
  如果要使用 JOTM,只需要下载最近的二元版本并将解压缩即可。再从 lib/ 目录下将.jar 文件(除了 log4j.jar、ommons-cli.jar 和 jotm_iiop_stubs.jar) 复制到 $CATALINA_HOME/shared/lib。这样就完成了。
  配置 TOMCAT
  需要配置 Tomcat,使之能够从 JNDI 获取 UserTransaction 和 DataSource 对象(它们用在 foo.BankAccount 和 bar.ATM)。
  首先,告诉 TOMCAT 你所使用的 JNDI 名字,以便在 WEB 应用程序中

分享到:
评论

相关推荐

    spring 3.0.5 + jotm 实现的的spring mvc 的例子

    这个项目可能旨在演示如何在Spring MVC环境中配置和管理事务,特别是使用JOTM作为外部事务管理器来处理数据库操作。 **Spring MVC框架**: Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序。它提供了...

    hibernate+tomca5.5t+JOTM 2.10 JTA配置

    1. **添加依赖**:首先,需要在项目的类路径中包含Hibernate、JTA和相关的库文件,比如JOTM(Java Open Transaction Manager),这是一个开源的JTA实现。 2. **配置JTA**:在Tomcat的server.xml或context.xml文件中...

    跨多个数据库操作,同时连接两个一上的数据库,用事物关联起来

    "用JOTM向Servlet中添加事务"的实践则说明了如何在Web应用程序中启用JTA事务,这在处理Web服务请求时特别有用,因为这些请求可能涉及到对多个数据库的修改。 JTA介绍和JTA与JDBC事务的文档深入介绍了JTA的工作原理...

    flex的第一步,安装、配置、与tomcat的挂接

    - 修改 `CLASSPATH` 变量,添加 `%CATALINA_HOME%\common\lib\servlet.jar`。 **4. 测试 Tomcat 安装** - 启动 Tomcat 的 `bin\startup.bat` 脚本。 - 在浏览器中访问 `http://localhost:8080`,如果看到 Tomcat ...

    tomcat部署atlassian-jira-5.2.4需要的jar包及参考文档

    2. **jotm-1.4.3.jar**:Java Open Transaction Manager(JOTM)是一个开源的Java事务管理器,用于处理JIRA中的分布式事务。 3. **commons-logging-1.1.2.jar**:Apache Commons Logging是一个日志框架抽象层,允许...

    JBPM5入门学习.doc

    - **4.3.4 使用jotm配置tomcat数据源以支持JTA**: 通过Jotm配置Tomcat的数据源,以支持分布式事务。 - **4.3.5 Jbpm相关配置文件更新**: 更新JBPM相关的配置文件,如persistence.xml、jbpm.cfg.xml等。 - **4.3.6 ...

    flex的安装、配置、与tomcat的挂接

    3. **配置context.xml**:在Tomcat的conf目录下找到context.xml文件,添加JOTM(Java Open Transaction Manager)的相关配置,确保Flex应用能正确处理事务管理。 #### 六、启动并测试 完成上述所有步骤后,重新...

    java开源包8

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包1

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包11

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包2

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包3

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包6

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包5

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包10

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包4

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包7

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包9

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包101

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

Global site tag (gtag.js) - Google Analytics