因为需要将项目从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
- 浏览: 10447 次
- 性别:
- 来自: 珠海
文章分类
最新评论
发表评论
-
EJB中三种Bean的总结
2013-05-18 23:56 619EJB中三种Bean的总结 会话bean(session ... -
[11]JDBC的批处理功能
2013-05-05 12:17 585[11]JDBC的批处理功能 import java ... -
[10]JDBC调用存储过程和插入数据后返回主键
2013-05-05 12:16 917[10]JDBC调用存储过程和插入数据后返回主键 i ... -
[8]jdbc事务和事务的保存点处理
2013-05-05 12:07 557[8]jdbc事务和事务的保存点处理 import ... -
[7]事务的隔离级别
2013-05-05 12:04 524[7]事务的隔离级别 下表显示了不同隔离级别允许的并发副 ... -
[6]用jdbc访问二进制类型的数据(BLOB大字段使用字节流)
2013-05-01 22:18 1172import java.io.BufferedInputS ... -
[5]用jdbc访问大段文本数据(CLOB大字段使用字符流)
2013-05-01 22:16 693import java.io.BufferedReader ... -
[4]jdbc中的数据类型与日期问题
2013-05-01 22:15 672import java.sql.Connection; ... -
[3]JDBC中的SQL注入问题
2013-04-12 22:50 623JDBC中的SQL注入问题 使用预处理( Prepare ... -
[2]JDBC实现增删改查CRUD
2013-04-11 22:11 722JDBC实现增删改查CRUD import java ... -
JDBC目录
2013-04-09 23:32 539JDBC目录 [1]JDBC简单介绍和示例 [2]JD ... -
[1]JDBC简单介绍和示例
2013-04-09 23:31 572JDBC简单介绍和示例 Jdbc单例类:Jdbc ... -
Hibernate_3.2.5_目录
2013-04-06 14:33 302Hibernate_3.2.5_目录 [1]Hibernat ...
相关推荐
本文将深入探讨如何在Tomcat应用服务器上集成JTA,并使用JOTM(Java Open Transaction Manager)或Atomikos作为事务管理器来实现分布式事务。 首先,我们需要理解JTA的核心概念。JTA是Java EE平台的一部分,提供了...
JOTM实现了Java Transaction API (JTA),这是一个标准接口,允许应用程序进行分布式事务处理。JOTM支持X/Open XA规范,允许管理跨越多个资源(如数据库和消息队列)的事务。在Tomcat中配置JOTM,可以提供更高级别的...
2. **JTA兼容**:遵循Java EE的JTA标准,使得JOTM可以无缝集成到任何符合J2EE规范的应用服务器中,如Tomcat、Jetty等轻量级容器。 3. **高性能与可扩展性**:JOTM设计时考虑了性能和扩展性,能够在高并发环境下保持...
而在Tomcat等轻量级服务器中,则需要借助外部框架如Jotm、Atomikos来实现分布式事务。 **特点**: - 实现相对简单,适用于单体应用中跨库操作的需求。 - 对性能影响较大,不适合高并发场景。 #### 四、本地消息表...
在Spring框架中,JTA(Java Transaction API)事务管理是一种用于处理分布式事务的高级机制,它允许应用程序在多个数据源之间进行协调的事务操作。本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM...
JTS,即Java Transaction Service,是Java EE中的一个组件,用于管理跨多个资源的分布式事务。它基于CORBA的交易服务(OTS),允许在不同的JVM之间协调事务。JOTM作为JTA的一个实现,虽然不直接支持JTS,但可以通过...
标题 "hibernate+tomcat5.5+JOTM 2.10 JTA配置" 涉及的是在Java环境下使用Hibernate ORM框架与Tomcat 5.5应用服务器,以及集成JOTM(Java Open Transaction Manager)进行JTA(Java Transaction API)管理的配置过程...
通过这个接口,JOTM能够协调跨多个资源的分布式事务。 3. **轻量级和高效**:JOTM设计为轻量级事务管理器,它的内存占用和性能开销相对较低,适合于各种规模的应用程序,从小型Web应用到大型企业级系统。 4. **...
本文详细介绍了如何在Tomcat服务器环境下使用Spring框架结合JOTM进行多数据源下的分布式事务管理。通过上述步骤,开发者可以轻松地搭建起一套完整的多数据源事务处理环境,为复杂业务场景提供强大的支持。这种配置...
1. 分布式事务管理:JOTM遵循JTA(Java Transaction API)标准,能够管理跨多个数据库、消息队列和其他资源的事务。它支持X/Open XA规范,提供两阶段提交(2PC)和三阶段提交(3PC)等事务协议,确保在分布式系统中...
JTA是Java平台上的标准接口,用于管理分布式事务处理,确保在多线程和分布式环境中的数据一致性。JOTM在Java应用中扮演着至关重要的角色,特别是在那些需要高可用性和可靠性的企业级系统中。 JOTM 2.0源码包的获取...
开源事务管理器 JOTM 是一个基于 Java 的开放源代码事务处理系统,它遵循 Java Transaction API (JTA) 标准,为分布式环境中的应用程序提供事务管理服务。JOTM 提供了高度可配置和可扩展的框架,使得开发者能够在...
JOTM是OpenWebBeans项目的一部分,它实现了Java Transaction API (JTA),这是一个用于管理分布式事务的标准接口。JTA允许在不同数据源之间协调事务,确保数据的一致性和完整性。JOTM是开源的,且完全符合JTA 1.1规范...
JTA是Java平台企业版(Java EE)的一部分,它定义了处理分布式事务的标准接口。JOTM能够协调跨多个资源(如数据库、消息队列等)的事务,确保数据的一致性和完整性。 描述中提到的"用于Tomcat和FDS同步"表明JOTM在...
通过这些内容,开发者可以构建一个支持分布式事务处理的环境,特别是在Java应用服务器上,如Tomcat、JBoss等,JOTM能提供强大的事务管理能力,确保在复杂的网络环境中数据的一致性和完整性。了解并熟练使用JOTM,对...
总之,JOTM是Java平台上重要的事务管理工具,它提供了遵循JTA标准的分布式事务处理能力。"jotm-dist-2.1.9-bin.tar.gz"这个压缩包是该工具的一个发行版本,包含了运行和配置JOTM所需的全部组件。用户可以通过解压并...
JTA是Java平台中处理分布式事务的标准API,而JOTM是其中的一个开源事务管理器实现。这些文档可能详细阐述了如何在Tomcat服务器上集成JOTM,以实现跨多个数据源的事务一致性,这对于企业级应用是必不可少的。 最后,...
5. **jta-1.0.1B.jar**:Java Transaction API(JTA)库,为分布式事务处理提供支持,与JOTM一起工作。 这些jar文件需要被添加到Tomcat的`lib`目录下,以便它们可以在服务器启动时被加载,从而为JIRA提供必要的服务...
JOTM(Java Open Transaction Manager)是ObjectWeb组织的一个开源JTA实现,它也是JOnAS(Java Open Application Server)的一部分,为JOnAS提供分布式事务功能。Spring从2.0版本开始,就包含了对JOTM的支持,通过`...