`
zhjump
  • 浏览: 10447 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

[9]JTA分布式事务与Tomcat(使用JOTM)

    博客分类:
  • Java
阅读更多

因为需要将项目从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 

分享到:
评论

相关推荐

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

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

    Tomcat中使用JOTM2.14

    JOTM实现了Java Transaction API (JTA),这是一个标准接口,允许应用程序进行分布式事务处理。JOTM支持X/Open XA规范,允许管理跨越多个资源(如数据库和消息队列)的事务。在Tomcat中配置JOTM,可以提供更高级别的...

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

    2. **JTA兼容**:遵循Java EE的JTA标准,使得JOTM可以无缝集成到任何符合J2EE规范的应用服务器中,如Tomcat、Jetty等轻量级容器。 3. **高性能与可扩展性**:JOTM设计时考虑了性能和扩展性,能够在高并发环境下保持...

    分布式事务的介绍

    而在Tomcat等轻量级服务器中,则需要借助外部框架如Jotm、Atomikos来实现分布式事务。 **特点**: - 实现相对简单,适用于单体应用中跨库操作的需求。 - 对性能影响较大,不适合高并发场景。 #### 四、本地消息表...

    在Spring中使用JTA事务管理

    在Spring框架中,JTA(Java Transaction API)事务管理是一种用于处理分布式事务的高级机制,它允许应用程序在多个数据源之间进行协调的事务操作。本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM...

    java事务处理包正版的JOTM

    JTS,即Java Transaction Service,是Java EE中的一个组件,用于管理跨多个资源的分布式事务。它基于CORBA的交易服务(OTS),允许在不同的JVM之间协调事务。JOTM作为JTA的一个实现,虽然不直接支持JTS,但可以通过...

    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)管理的配置过程...

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

    通过这个接口,JOTM能够协调跨多个资源的分布式事务。 3. **轻量级和高效**:JOTM设计为轻量级事务管理器,它的内存占用和性能开销相对较低,适合于各种规模的应用程序,从小型Web应用到大型企业级系统。 4. **...

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

    本文详细介绍了如何在Tomcat服务器环境下使用Spring框架结合JOTM进行多数据源下的分布式事务管理。通过上述步骤,开发者可以轻松地搭建起一套完整的多数据源事务处理环境,为复杂业务场景提供强大的支持。这种配置...

    jotm 2.1.9 源码

    1. 分布式事务管理:JOTM遵循JTA(Java Transaction API)标准,能够管理跨多个数据库、消息队列和其他资源的事务。它支持X/Open XA规范,提供两阶段提交(2PC)和三阶段提交(3PC)等事务协议,确保在分布式系统中...

    jotm2.0最新源码包

    JTA是Java平台上的标准接口,用于管理分布式事务处理,确保在多线程和分布式环境中的数据一致性。JOTM在Java应用中扮演着至关重要的角色,特别是在那些需要高可用性和可靠性的企业级系统中。 JOTM 2.0源码包的获取...

    开源事务管理器 JOTM.7z

    开源事务管理器 JOTM 是一个基于 Java 的开放源代码事务处理系统,它遵循 Java Transaction API (JTA) 标准,为分布式环境中的应用程序提供事务管理服务。JOTM 提供了高度可配置和可扩展的框架,使得开发者能够在...

    flex与java整合专用jotm

    JOTM是OpenWebBeans项目的一部分,它实现了Java Transaction API (JTA),这是一个用于管理分布式事务的标准接口。JTA允许在不同数据源之间协调事务,确保数据的一致性和完整性。JOTM是开源的,且完全符合JTA 1.1规范...

    ow2-jotm-src-2.2.1-src.tar

    JTA是Java平台企业版(Java EE)的一部分,它定义了处理分布式事务的标准接口。JOTM能够协调跨多个资源(如数据库、消息队列等)的事务,确保数据的一致性和完整性。 描述中提到的"用于Tomcat和FDS同步"表明JOTM在...

    jotm-2.0.11.MR5.tgz

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

    jotm-dist-2.1.9-bin.tar.gz

    总之,JOTM是Java平台上重要的事务管理工具,它提供了遵循JTA标准的分布式事务处理能力。"jotm-dist-2.1.9-bin.tar.gz"这个压缩包是该工具的一个发行版本,包含了运行和配置JOTM所需的全部组件。用户可以通过解压并...

    java资料夹

    JTA是Java平台中处理分布式事务的标准API,而JOTM是其中的一个开源事务管理器实现。这些文档可能详细阐述了如何在Tomcat服务器上集成JOTM,以实现跨多个数据源的事务一致性,这对于企业级应用是必不可少的。 最后,...

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

    5. **jta-1.0.1B.jar**:Java Transaction API(JTA)库,为分布式事务处理提供支持,与JOTM一起工作。 这些jar文件需要被添加到Tomcat的`lib`目录下,以便它们可以在服务器启动时被加载,从而为JIRA提供必要的服务...

    Spring框架技术

    JOTM(Java Open Transaction Manager)是ObjectWeb组织的一个开源JTA实现,它也是JOnAS(Java Open Application Server)的一部分,为JOnAS提供分布式事务功能。Spring从2.0版本开始,就包含了对JOTM的支持,通过`...

Global site tag (gtag.js) - Google Analytics