`

在Tomcat中使用JDBC与JTA

    博客分类:
  • J2EE
 
阅读更多
转自:http://www.blogjava.net/zhanglijun33/archive/2006/09/21/jta.html

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

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

    使用JTA实现跨库事务

    1. **配置JTA服务**:首先,你需要在应用服务器(如Tomcat、JBoss、WebLogic等)中配置JTA服务。这通常涉及在服务器配置文件中启用JTA支持,并为每个资源管理器(如数据库连接池)配置事务属性。 2. **获取事务管理...

    完整的jta例子 mysql测试

    在这个例子中,我们将深入探讨如何在MySQL数据库环境下使用JTA来实现跨不同数据存储的事务一致性。 【描述】虽然描述部分为空,但根据标题,我们可以推测这是博主Andilyliao在iteye博客上分享的一个详细教程,目的...

    JNDI tomcat

    **二、JNDI在Tomcat中的使用** 1. **配置Tomcat的JNDI**:在Tomcat的`server.xml`配置文件中,可以通过`GlobalNamingResources`元素定义全局资源,如数据源。这些资源可以在Web应用中通过JNDI查找获取。 2. **应用...

    springboot+jta+atomikos

    它包括事务协调器、事务管理器以及对各种资源的适配器,如JDBC驱动、JMS供应商等,确保了在分布式环境中的一致性和可靠性。 在“springboot+jta+atomikos”项目中,Spring Boot作为基础框架,负责整体应用的结构和...

    java实现JTA简单例子

    在描述中提到了`mysql-connector-java`,这意味着我们将使用MySQL数据库,并且其JDBC驱动支持JTA。 在实际操作中,一个简单的JTA示例可能如下: 1. 首先,通过`UserTransaction`开始一个事务。 2. 然后,获取到`XA...

    Spring3.1+Hibernate4.1+Atomikos3.9+MySql5.1+Tomcat5/6/7实现JTA事务管理

    标题中的“Spring3.1+Hibernate4.1+Atomikos3.9+MySql5.1+Tomcat5/6/7实现JTA事务管理”揭示了一个集成开发环境,用于构建分布式、事务一致性的Java应用程序。这个组合利用了Spring框架的依赖注入和AOP(面向切面...

    Tomcat中配置数据源所需得jar包

    为了使Tomcat能够与数据库进行交互,我们需要在Tomcat环境中配置数据源。数据源(DataSource)是Java EE应用程序中管理数据库连接的一种方式,它可以提供线程安全的连接池,从而提高应用程序的性能和效率。本文将...

    maven springboot jta mybatis 分布式事物

    通过在项目中使用 Maven,我们可以方便地导入所需的库,如 Spring Boot 和 MyBatis,同时通过 Maven 的生命周期来编译、打包和部署应用。 `Spring Boot` 是基于 Spring 框架的简化开发工具,它提供了一种快速构建...

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

    tomcat 6.0 lib jar

    6. **JDBC驱动**:如果你的Web应用需要连接数据库,那么对应的JDBC驱动jar文件(如`mysql-connector-java.jar`)会放在lib目录下,以便Tomcat能正确地加载和使用。 7. **其他依赖**:`commons-logging.jar`、`...

    springboot+mybatis+jta+atomikos解决多数据源事务问题.pdf

    在配置文件中,通常还会指定使用的JDBC驱动版本,以便与数据库和应用服务器兼容。 在Spring Boot应用中,为了管理多个数据源,通常需要创建多个数据源的配置类,并在其中定义相应的`DataSource`、`...

    Tomcat与Java.Web开发技术详解

    总之,《Tomcat与Java.Web开发技术详解》这本书将带领读者全面了解并掌握使用Tomcat进行Java Web开发的核心技术,无论你是初学者还是有经验的开发者,都能从中受益。通过学习和实践书中的示例,你将能够自信地构建出...

    Tomcat & Http协议

    JavaEE 规范是很多 Java 开发技术的总称,包括了 13 个技术规范,例如 JSP/Servlet、JNDI、JAXP、JDBC、JNI、JAXB、JMF、JTA、JPA、EJB 等。 在 Web 领域中,我们需要了解静态资源和动态资源的概念。静态资源指的是...

    spring boot下学习mybatis+mysql使用jta对多数据源事务进行整合.zip

    这些事务管理器实现了JTA规范,能够在Spring Boot中与多个数据源协同工作。配置这些事务管理器通常涉及到添加相应的依赖、配置文件设置以及bean的创建。 在实际的代码实现中,我们可能会有多个`@Service`层的类,每...

    jbpm5.4工作台运行环境移植到tomcat

    jbpm5.4工作台运行环境移植到Tomcat是一个常见的需求,特别是在企业环境中,由于Tomcat的轻量级和广泛使用,很多开发者倾向于在Tomcat上部署应用。以下是移植过程中的关键步骤和知识点: 首先,jbpm是Business ...

    你不知道的JDBC高级应用

    6.结果集:在JAVA中完全可以把结果集当作游标来处理,获得Statement可以添加的参数. 7.事务:设定事务的保存点,可以把事务隔离. crud c:create r:read u:update d:delete JTA 分布式事务 跨数据库的事务 JNDI TomCat ...

    jsf2.0+jdbc实例

    在这个实例中,我们将深入探讨JSF 2.0与JDBC(Java Database Connectivity)的结合使用,以及在Tomcat 6.0应用服务器上的部署实践。 **JSF 2.0的核心概念** 1. **组件模型**:JSF 2.0的核心是组件模型,它将用户...

Global site tag (gtag.js) - Google Analytics