回滚不适用于使用 JOTM 的 tomcat



我正在使用oc4j开发一个涉及JSP,servlets和JDBC(dayabase:oracle 11gr2)的weba应用程序。使用了内置的事务管理器,并且提交和回滚曾经工作正常。

但是,由于许可,我们现在应该将代码移动到像 tomcat 这样的免费服务器。我已经按照这篇文章中的步骤在 tomcat 中实现了 JOTM 作为事务管理器:

http://codepitbull.wordpress.com/2011/07/08/tomcat-7-with-full-jta/

以下是 %CATALINA_HOME%/conf/context 中的配置.xml

    <Resource name="jdbc/ticketds" 
              auth="Container" 
              type="javax.sql.DataSource"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
              validationQuery="SELECT 1"
              maxActive="30" 
              minIdle="2" 
              maxWait="10000" 
              initialSize="10"
              defaultAutoCommit="false"
              username="xxxx" 
              password="xxxxx" 
              driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@//xxxxx.xxxx.com:iiii/xyz"/>
<Resource name="jdbc/taskds" 
              auth="Container" 
              type="javax.sql.DataSource"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
              validationQuery="SELECT 1"
              maxActive="30" 
              minIdle="2" 
              maxWait="10000" 
              initialSize="10"
              defaultAutoCommit="false"
              username="apps" 
              password="few1idna" 
              driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@//xxxxx.xxxx.com:iiii/xyz"/>
  <Transaction factory="org.objectweb.jotm.UserTransactionFactory"
               jotm.timeout="600"/>

web.xml 配置为在资源引用中提及数据源,如下所示:

    <resource-ref>
    <description>Ticket Datasource configuration</description>
    <res-ref-name>jdbc/ticketds</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
    <description>SR Datasource configuration</description>
    <res-ref-name>jdbc/taskds</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

但是,当我尝试执行回滚时,它无济于事。这是我用于测试的回滚示例测试代码:

UserTransaction utx = DBUtil.getUserTransaction();
    Connection conn = DBUtil.getConnection();
    TicketMessageVO newTicket = null;
    try {
        utx.begin();
        newTicket = new TicketDAO(conn).createTicket(ticket);

        // testing only
        if(1==1) throw new Exception("Testing transaction rollback");
        utx.commit();
        logger.log(Level.INFO, "Ticket created successfully: " + ticket.getMessageId());
    } catch (Throwable e) {
        utx.rollback();
        logger.log(Level.SEVERE, "Error in creating ticket: ", e);
        throw new Exception(e);
    } finally {
        DBUtil.closeResources(null, null, conn);
    }
    return newTicket;

相同的代码用于与 oc4j 完美配合。我在配置中缺少某些内容吗?

谢谢。

我最近遇到了同样的问题,我使用 JOTM 自己的数据源工厂 ( org.objectweb.jotm.datasource.DataSourceFactory ) 而不是 Tomcat 的解决了它。这是您的上下文.xml应该的样子:

<Resource name="jdbc/taskds" 
          auth="Container" 
          type="javax.sql.DataSource"
          factory="org.objectweb.jotm.datasource.DataSourceFactory" 
          validationQuery="SELECT 1"
          maxActive="30" 
          minIdle="2" 
          maxWait="10000" 
          initialSize="10"
          defaultAutoCommit="false"
          username="apps" 
          password="few1idna" 
          driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:thin:@//xxxxx.xxxx.com:iiii/xyz"/>

但是,以这种方式使用 JOTM 会导致 Tomcat 在关机期间挂起(可能是由于 Carol 中的非守护进程线程)。

相关内容

  • 没有找到相关文章

最新更新