2013-11-04 6 views
0

JSP, 서블릿 및 JDBC (dayabase : oracle 11gr2)와 관련된 weba 어플리케이션 개발에 oc4j를 사용하고있었습니다. 트랜잭션 관리자와 커밋 및 롤백 기능을 사용하여 잘 작동했습니다.JOTM을 사용하여 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

최근에 같은 문제가 발생하여 Tomcat 대신 JOTM의 자체 데이터 소스 팩토리 (org.objectweb.jotm.datasource.DataSourceFactory)를 사용하여 해결했습니다.

<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이 종료하는 동안 정지됩니다 (때문에 캐롤의 비 데몬 스레드에 어쩌면) :이처럼 당신의 context.xml이 보일 것입니다 방법이다.

관련 문제