2013-11-04 29 views
0

我使用oc4j開發涉及JSP,servlets和JDBC(daybase:oracle 11gr2)的weba應用程序。曾經使用內置的事務管理器和提交和回滾用於正常工作。rollback不能與使用JOTM的tomcat配合使用

但是,由於授權,我們現在應該將代碼移動到像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"/> 

該網站.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完美配合使用的相同位代碼。我在配置中丟失了什麼?

謝謝。

+0

現在使用Atomikos。工作得很好,記錄正確。儘管如此,仍然對這個問題提出建議。謝謝。 –

回答

1

我最近遇到同樣的問題,我用JOTM自己的數據源工廠(org.objectweb.jotm.datasource.DataSourceFactory)而不是Tomcat解決了這個問題。這是你的context.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的關機過程中掛起(可能是由於在卡羅爾非守護線程)。

相關問題