在Tomcat中透过JOTM支持JTA

64 篇文章 0 订阅

http://www.myexception.cn/program/676856.html

在Tomcat中通过JOTM支持JTA

    Tomcat是Servlet容器,但它提供了JNDI的实现,因此用户可以象在Java EE应用程序服务器中一样,在Tomcat中使用JNDI查找JDBC数据源。在事务处理方面,Tomcat本身并不支持JTA,但是可以通过集成JOTM达到目的。

    如果你的应用最终部署到一个功能齐备的Java EE应用服务器上,也许你更希望使用Java EE应用服务器的JTA功能,这样可以利用应用服务器本身许多优化措施。下面,我们让Tomcat通过JNDI开放JOTM的JTA的数据源,进而在 Spring容器引用这个JNDI数据源,并在此基础上提供JTA事务。我们所使用的环境是:Tomcat 5.5+JOTM 2.3。 
    1. 添加所需的JAR文件 
    将JOTM以下类包添加到<Tomcat安装目录>/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驱动类包,例如MySQL的mysql.jar。

    2. 配置JOTM 
    新建一个carol.properties配置文件,放置到<Tomcat安装目录>/common/classes目录下,配置文件内容如下: 
    #JNDI调用协议 
    carol.protocols=jrmp 
    # 本地RMI调用 
    carol.jvm.rmi.local.call=true 
    # 不使用CAROL的JNDI封装器 
    carol.start.jndi=false 
    # 不启用命名服务器 
    carol.start.ns=false 
    # 命名工厂类 
    carol.jndi.java.naming.factory.url.pkgs=org.apache.naming 
    将carol.start.jndi设置为false,让JOTM不使用CAROL JNDI wrapper,从而可以避免类装载错误的发生。

    3. 配置Tomcat环境,配置JNDI的数据源 
    在<Tomcat安装目录>/conf/context.xml文件中添加以下内容:

1:JNDI数据源 
<Resource name="jdbc/topicDS" auth="Container"type="javax.sql.DataSource" 
factory="org.objectweb.jndi.DataSourceFactory"username="root"password="1234" 
driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3309/topicdb"maxActive="30"maxIdle="30"/>

 

2:JNDI数据源
<Resource name="jdbc/postDS"auth="Container"type="javax.sql.DataSource"

factory="org.objectweb.jndi.DataSourceFactory"username="root"password="1234" 
driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3309/postdb"maxActive="30"maxIdle="30"/>


3:JOTM JTA事务管理

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

或者4:

<Resource name="UserTransaction" auth="Container"
type="javax.transaction.UserTransaction"
factory = "org.objectweb.jotm.UserTransactionFactory"
jotm.timeout = "60"/>


   在Tomcat中配置两个JNDI数据源,它们分别指向topicdb和postdb数据库,如①处所示。最后配置JOTM的JTA事务管理器,该事务管理器自动对两个JNDI中的数据源应用JTA事务。

 

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

 

测试代码:

ResultSet rs = null;
Statement stmt = null;
UserTransaction ut = null;
Connection conn = null;


Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds1 = (DataSource) envCtx.lookup("jdbc/topicDS");
DataSource ds2 = (DataSource) envCtx.lookup("jdbc/postDS");
 ut = (UserTransaction)initCtx.lookup("java:comp/UserTransaction");
conn1 = ds1.getConnection();
conn2= ds2.getConnection();
ut.begin();

conn1 操作
conn2 操作

ut.rollback();


.......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值