`
seara
  • 浏览: 655034 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在Tomcat中通过JOTM支持JTA

阅读更多
因为需要将项目从IBM WebSphere Application Server移植到Tomcat上开发,所以研究了一下在Tomcat中通过JNDI查找和使用JDBC及JTA的方法。

Tomcat 是Servlet容器,但它也提供了一个JNDI InitialContext实现,因此用户可以像在J2EE应用程序服务器中一样在Tomcat中使用JNDI查找JDBC数据源。不过在事务处理方面,Tomcat本身并不支持JTA(Java Transaction API),所以需要借助其他的方案。
JOTM(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现,它本身也是开源应用程序服务器JOnAS(Java Open Application Server)的一部分,为其提供JTA支持和分布式事务管理。JOTM同样可以为Tomcat提供JTA支持,以下将对相关的配置进行简单说明,使用的相应版本为:

Tomcat 5.5.x
JOTM 2.0.x
Oracle 9i

1. 配置Tomcat环境

在$TOMCAT_HOME/conf/context.xml文件中添加以下内容:

<Resource name="jdbc/framework" auth="Container"
type="javax.sql.DataSource"
factory="org.objectweb.jndi.DataSourceFactory"
username="user" password="pwd"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@172.18.136.200:1521:ORADB"
maxActive="30" maxIdle="30"/>

<Transaction factory="org.objectweb.jotm.UserTransactionFactory"
jotm.timeout="60"/>

2. 添加所需的JAR文件

下载JOTM,将以下文件添加到$TOMCAT_HOME/common/lib/:
jotm.jar
jotm_jrmp_stubs.jar
jotm_iiop_stubs.jar
ow_carol.jar
jta-spec1_0_1.jar
jts1_0.jar
objectweb-datasource.jar
xapool.jar
howl.jar
connector-1_5.jar
同时,还需要添加相应数据库的JDBC包,例如Oracle的classes12.jar

3. 配置JOTM

新建一个carol.properties文件,置于$TOMCAT_HOME/common/classes/,文件内容如下:

# JNDI (Protocol Invocation)
carol.protocols=jrmp

# Local RMI Invocation
carol.jvm.rmi.local.call=true

# do not use CAROL JNDI wrapper
carol.start.jndi=false

# do not start a name server
carol.start.ns=false

# Naming Factory
carol.jndi.java.naming.factory.url.pkgs=org.apache.naming

这样JOTM将不会使用CAROL JNDI wrapper,从而可以避免类装载错误的发生

4. 说明

4.1 JOTM目前的版本在JDK1.5或以上可能无法正常运行,解决的方法有两个:使用JDK1.5重新编译carol库,或者将Tomcat运行在JDK1.4中

4.2 <Transaction>是Tomcat 5中的新标记,对于不支持此标记的老版本,需要使用以下语句代替事务资源的声明:

<!-- Resource configuration for UserTransaction
use JOTM
-->
<Resource name="UserTransaction" auth="Container"
type="javax.transaction.UserTransaction"
factory = "org.objectweb.jotm.UserTransactionFactory"
jotm.timeout = "60"/>

4.3 需要注意的是,使用<Resource>节点声明的资源默认上下文前缀是"java:comp/env",而使用< Transaction>节点时则是"java:comp"。因此,当使用4.2的方式声明用户事务时,相应的JNDI查找代码也应该改为 UserTransaction ut = (UserTransaction)initCtx.lookup("java:comp/env/UserTransaction");

5. 测试
假设数据库中已经做了相应配置,可以使用如下jsp页面进行测试:
<!--test.jsp-->
<%@page contentType="text/html;charset=GB2312"%>
<%@page import="java.sql.*"%>
<%@page import="javax.sql.*"%>
<%@page import="javax.naming.*"%>
<%@page import="javax.transaction.UserTransaction"%>
<%
ResultSet rs = null;
Statement stmt = null;
UserTransaction ut = null;
Connection conn = null;
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/framework");
ut = (UserTransaction)initCtx.lookup("java:comp/UserTransaction");
conn = ds.getConnection();

ut.begin();
System.out.println("<<< beginning the transaction >>>");

stmt = conn.createStatement(
// ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE
);
rs = stmt.executeQuery("SELECT PRICE FROM TM_PRODUCT WHERE ID=1");
rs.next();
} catch(Exception e) {e.printStackTrace();}
%>
<html>
<body>
Original price:
<%=rs.getString("price")%>
<br>After update:
<%
PreparedStatement pstmt = conn.prepareStatement("update tm_product set price=? where id=1");
pstmt.setInt(1,101);
pstmt.executeUpdate();
rs = stmt.executeQuery("SELECT PRICE FROM TM_PRODUCT WHERE ID=1");
rs.next();
%>
<%=rs.getString("price")%>
<br>After Rollback:
<%
System.out.println("<<< rolling back the transaction >>>");
ut.rollback();//Or ut.commit();
rs = stmt.executeQuery("SELECT PRICE FROM TM_PRODUCT WHERE ID=1");
rs.next();
%>
<%=rs.getString("price")%>
<%conn.close();%>
</body>
</html>

6. 参考
How to use JDBC and transactions in Tomcat with JOTM
How to use JDBC and transactions in Tomcat with JOTM(For Tomcat 5.5.x)
UserTransaction, JOTM and Tomcat 5.5.x


国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    Tomcat中使用JOTM2.14

    标题“Tomcat中使用JOTM2.14”指的是在Apache Tomcat服务器中集成并使用JOTM(Java Open Transaction Manager)版本2.14的过程。JOTM是一个开源的事务管理器,用于处理Java应用程序中的ACID(原子性、一致性、隔离性...

    java资料夹

    接着,我们看到了与JTA(Java Transaction API)和JOTM(Java Open Transaction Manager)相关的几个文档:`在Tomcat中通过JOTM支持JTA .txt`、`tomcat 配置jotm.txt`、`Tomcat6 Support JTA with JOTM.txt`。JTA是...

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

    标题 "hibernate+tomcat5.5+JOTM 2.10 JTA配置" 涉及的是在Java环境下使用Hibernate ORM框架与Tomcat 5.5应用服务器,以及集成JOTM(Java Open Transaction Manager)进行JTA(Java Transaction API)管理的配置过程...

    spring JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

    本文将深入探讨如何在Tomcat应用服务器上集成JTA,并使用JOTM(Java Open Transaction Manager)或Atomikos作为事务管理器来实现分布式事务。 首先,我们需要理解JTA的核心概念。JTA是Java EE平台的一部分,提供了...

    在Spring中使用JTA事务管理

    本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM(Java Open Transaction Manager)以及引用Tomcat的JTA事务。 ### 1. 通过集成JOTM,直接在Spring中使用JTA事务 #### 1.1. 添加JOTM类库到类路径...

    java事务处理包正版的JOTM

    JOTM 是一个强大的工具,尤其对于那些希望在Tomcat这样的轻量级应用服务器中实现企业级事务管理的开发者而言。在Servlet中调用JOTM,可以确保在分布式环境中执行的多个数据库操作或资源管理操作具有原子性、一致性、...

    jotm2.0最新源码包

    8. **集成与配置**:学习如何将JOTM集成到常见的Java应用服务器(如Tomcat、JBoss等)和Spring框架中,是实际开发中非常实用的部分。 通过深入研究JOTM 2.0的源码,开发者不仅可以掌握事务管理的精髓,还能提升对...

    jotm-2.0.11.MR5.rar_Jotm jar_jotm_jotm-2.0.11.MR5_jotm.jar _jtom

    JOTM(Java Open Transaction Manager)是一款开源的事务管理器,专为Java应用程序设计,它提供了强大的事务处理能力,支持JTA(Java Transaction API)规范,使得在分布式环境中进行事务管理变得更加便捷。JOTM ...

    jotm 2.1.9 源码

    本文将详细介绍JOTM的核心功能、如何使用MVN进行编译以及其在分布式事务处理中的应用。 一、JOTM核心功能 1. 分布式事务管理:JOTM遵循JTA(Java Transaction API)标准,能够管理跨多个数据库、消息队列和其他...

    spring+jotm 多数据源事务管理(三)JNDI+Tomcat

    为了能够顺利地在项目中使用JOTM进行事务管理,首先需要将以下JAR包加入到Tomcat的lib目录中: - `jotm.jar`: JOTM核心库。 - `jotm_jrmp_stubs.jar`: JOTM JRMP远程调用相关的类库。 - `ow_carol.jar`: 提供了与...

    开源事务管理器 JOTM.7z

    JOTM 作为 JTA 的实现,允许开发者利用这些接口在不同的系统之间协调事务,确保即使在复杂的分布式环境中也能保持数据的一致性。 JOTM 的主要特点包括: 1. **兼容性**:JOTM 完全符合 JTA 1.1 规范,可以与任何...

    jotm-2.0.11.MR5.tgz

    通过这些内容,开发者可以构建一个支持分布式事务处理的环境,特别是在Java应用服务器上,如Tomcat、JBoss等,JOTM能提供强大的事务管理能力,确保在复杂的网络环境中数据的一致性和完整性。了解并熟练使用JOTM,对...

    ow2-jotm-src-2.2.1-src.tar

    描述中提到的"用于Tomcat和FDS同步"表明JOTM在这个场景下,被用来在Apache Tomcat应用服务器和Fast Data Service (FDS)之间进行事务管理。Tomcat是一个流行的开源Java Servlet容器,而FDS可能是某种数据服务,具体是...

    flex与java整合专用jotm

    3. **Tomcat集成**:由于描述中提到JOTM布置在Tomcat下,我们需要在Tomcat的服务器配置中添加JOTM的相关设置。这通常涉及修改`context.xml`或`server.xml`文件,配置JNDI资源以引用JOTM事务管理器。 4. **JTA配置**...

    基于Java的开源事务管理器 JOTM.zip

    JOTM提供了符合JTA(Java Transaction API)标准的事务管理服务,使得开发者能够轻松地在不同数据存储之间实现ACID(原子性、一致性、隔离性和持久性)特性。 JOTM的主要功能和特性包括: 1. **JTA兼容性**:JOTM...

    jotm-dist-2.1.9-bin.tar.gz

    在实际应用中,JOTM可以被应用程序服务器如Tomcat、JBoss或者独立的应用程序所使用,通过JNDI查找来获取事务管理器实例,然后进行事务的开启、提交、回滚等操作。使用JOTM的好处在于它可以提供ACID(原子性、一致性...

    JOTM包

    JOTM 是一个基于Java开放源代码的事务处理管理器。它遵循JTA APIs规范与Business Transaction Protocol(BTP)规范以提供了对Web Service的支持。

    JBPM5.1入门学习

    4.3.4 使用jotm配置tomcat 数据源以支持JTA 25 4.3.5 Jbpm相关配置文件更新 29 4.3.6 Java服务器端编码 31 4.3.7 Jsp客户端编码 50 4.3.8 Struts和spring的配置 52 4.4 部署和运行 54 4.4.1 启动Demo Human Task ...

Global site tag (gtag.js) - Google Analytics