读书人

在Tomcat中经过JOTM支持JTA

发布时间: 2012-11-15 15:16:15 作者: rapoo

在Tomcat中通过JOTM支持JTA

1 概述

???因为需要将项目从IBM WebSphere ApplicationServer移植到Tomcat上开发,以提高开发效率,所以研究了一下在Tomcat中通过JNDI查找和使用JDBC及JTA的方法。

??? Tomcat是Servlet容器,但它也提供了一个JNDIInitialContext实现,因此用户可以像在J2EE应用程序服务器中一样在Tomcat中使用JNDI查找JDBC数据源。不过在事务处理方面,Tomcat本身并不支持JTA(JavaTransaction API),所以需要借助其他的方案。

????JOTM(Java Open TransactionManager)是ObjectWeb的一个开源JTA实现,它本身也是开源应用程序服务器JOnAS(Java OpenApplicationServer)的一部分,为其提供JTA支持和分布式事务管理。JOTM同样可以为Tomcat提供JTA支持,以下将对相关的配置进行简单说明,使用的相应版本为:

Jdk1.4.2

Tomcat 4.1.36

JOTM 2.0.x

Oracle 10G

2?How to use

1)?配置Tomcat环境

在$TOMCAT_HOME/conf/server.xml文件中对应应用的<Context>节点下面配置连接池,添加以下内容:

<Resource name="jdbc/myds"auth="Container"

???type="javax.sql.DataSource"/>

? <ResourceParamsname="jdbc/myds">

???<parameter>

?????<name>factory</name>

?????<value>org.objectweb.jndi.DataSourceFactory</value>

???</parameter>

???<!-- configured by default for PostgreSQL, justchange the values

????????to set it for your database

???-->

???<parameter><name>username</name><value>wangwang</value></parameter>

???<parameter><name>password</name><value>1235</value></parameter>

??????<!-- minimum number of connections in the pool-->

???<parameter><name>min</name><value>10</value></parameter>

??????<!-- maximumnumber of connections in the pool-->

??????<parameter><name>max</name><value>20</value></parameter>???

???<parameter>

?????<name>driverClassName</name>

?????<value>oracle.jdbc.driver.OracleDriver</value>

???</parameter>

???<parameter>

?????<name>url</name>

?????<value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>

???</parameter>

???<!--

???<parameter>

?????<name>driverClassName</name>

?????<value>org.gjt.mm.mysql.Driver</value>

???</parameter>

???<parameter>

?????<name>url</name>

?????<value>jdbc:mysql://localhost/javatest</value>

???</parameter>

???-->

?</ResourceParams>

? <!-- Resourceconfiguration for UserTransaction

??????use JOTM

? -->

? <Resourcename="UserTransaction" auth="Container"

???type="javax.transaction.UserTransaction"/>

? <ResourceParamsname="UserTransaction">

???<parameter>

?????<name>factory</name>

?????<value>org.objectweb.jotm.UserTransactionFactory</value>

???</parameter>

???<parameter>

?????<name>jotm.timeout</name>

?????<value>60</value>

???</parameter>

?</ResourceParams>

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

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

<!-- Resource configuration forUserTransaction

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-->

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.sql.*"%>

<%@pageimport="javax.sql.*"%>

<%@pageimport="javax.naming.*"%>

<%@pageimport="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/myds");

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 sysdate FROMdual");

rs.next();

} catch(Exception e) {e.printStackTrace();}

%>

<html>

<body>

Original price:

<%=rs.getString(1)%>

<%conn.close();%>

</body>

</html>

读书人网 >编程

热点推荐