2017-01-18 6 views
0

나는 atomikos 트랜잭션 및 데이터베이스 연결 물건을 테스트입니다를 사용하여 UserTransaction을,내가 아래의 코드를 실행하려고 그것의 한 부분으로 Atomikos

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.util.Properties; 

import javax.sql.XAConnection; 
import javax.transaction.Transaction; 
import javax.transaction.xa.XAResource; 

import com.atomikos.datasource.xa.jdbc.JdbcTransactionalResource; 
import com.atomikos.icatch.config.UserTransactionServiceImp; 
import com.atomikos.icatch.jta.UserTransactionManager; 
import com.atomikos.persistence.imp.StateRecoveryManagerImp; 
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource; 

/** 
* Working out how to use Atomikos, before building {@link Main}. It is not 
* intended that you write your applications like this - use JCA+EJB or Spring 
* instead! There is way too much boilerplate code here. Based on examples found 
* at the Atomikos website. 
*/ 
public class TestAtomikos { 

    public static void main(String[] args) throws Exception { 

     MysqlXADataSource mysql = new MysqlXADataSource(); 
     mysql.setUser("root"); 
     mysql.setPassword("root"); 
     mysql.setUrl("jdbc:mysql://localhost:3306/world?useSSL=false"); 
     JdbcTransactionalResource mysqlResource = new JdbcTransactionalResource(
       "jdbc/mysql", mysql); 

     UserTransactionServiceImp utsi = new UserTransactionServiceImp(); 
     utsi.registerResource(mysqlResource); 
     Properties prop = new Properties(); 
     InputStream input = null; 
     //StateRecoveryManagerImp srmi = new StateRecoveryManagerImp(null); 

     try { 

      input = new FileInputStream("C:\\Users\\abcd\\eclipse\\workspace_Tomcat\\JNDI\\src\\main\\resources\\jta.properties"); 

      // load a properties file 
      prop.load(input); 

     } 
     catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

     utsi.init(prop); 
     //utsi.init(); 

     UserTransactionManager utm = new UserTransactionManager(); 
     //utm.init(); 
     utm.begin(); 
     Transaction tx = utm.getTransaction(); 
     XAConnection xamysql = mysql.getXAConnection(); 
     XAResource db = xamysql.getXAResource(); 
     tx.enlistResource(db); 

     Connection connection = xamysql.getConnection(); 
     PreparedStatement stmt=connection.prepareStatement("SELECT ID, Name FROM city"); 
     ResultSet rs = null; 
     rs = stmt.executeQuery("SELECT ID, Name FROM city"); 
     while(rs.next()) 
     { 
      System.out.println(rs.getInt("ID") + " " + rs.getString("Name")); 
     } 

    } 
} 

하지만 난 오류가 점점 오전,

을 시작할 수 없습니다
log4j:WARN No appenders could be found for logger (com.atomikos.logging.LoggerFactory). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 
Exception in thread "main" java.lang.NoSuchMethodError: com.atomikos.persistence.imp.StateRecoveryManagerImp: method <init>()V not found 
    at com.atomikos.icatch.standalone.UserTransactionServiceImp.createDefault(UserTransactionServiceImp.java:205) 
    at com.atomikos.icatch.standalone.UserTransactionServiceImp.init(UserTransactionServiceImp.java:258) 
    at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:405) 
    at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:577) 
    at com.test.abcd.TestAtomikos.main(TestAtomikos.java:57) 

tomcat과 atomikos를 통합하고 db를 호출하는 서블릿을 호출하여 동일한 실행을 시도했습니다. 나는 같은 오류가있어, 나는 StateRecoveryManagerImp 온라인 코드를 확인하는데 지쳤다. 나는 정의 된 init 메소드를 본다. 나는이 문제를 일으키는 것이 확실하지 않습니다. 난 그냥 데이터베이스 물건을 시도, 괜찮 았어, 나는 쿼리를 실행하고 결과도 얻을 수있었습니다.

나는 atomikos 항아리의 다양한 버전을 사용해 보았지만 행운은 없었다. 이 문제를 해결하는 방법에 대한 제안 사항은 무엇입니까? 당신은 어느 얻을

답변

0

예외 :

NoSuchMethodError: com.atomikos.persistence.imp.StateRecoveryManagerImp: method()V not found

는 클래스 StateRecoveryManagerImp의 (인수가없는 생성자) 기본 생성자에 액세스하기 위해 런타임에 시도하고 그것을 찾을 수 있다는 것을 의미한다.

일반적으로 한 버전의 라이브러리로 응용 프로그램을 빌드하고 호환되지 않는 다른 버전에 대해 실행할 때 예외가됩니다. 나는 소스 코드에서 볼 수 있듯이 여기

까지, 난 당신이 우리가 (당신이 here을 볼 수) 기본 생성자를 가지고 있고, 즉 정의 된 생성자가 없습니다 그 transactions3.9.0 이상 사용하여 코드를 컴파일 있다고 생각 귀하의 응용 프로그램은 실행시 런타임에 호출하려고 할 때 (here을 볼 수있는 것처럼) 기본 생성자가 없다는 의미 인 public StateRecoveryManagerImp (ObjectLog objectlog) 유형의 생성자를 가진 이전 버전을 사용합니다.

문제를 해결하려면 런타임시 사용되는 클래스 경로를 확인하고 컴파일시 사용 된 버전과 일치하는 transactions 버전 만 있는지 확인하십시오.

+0

입력 해 주셔서 감사합니다. 내 항아리를 확인하고 런타임에 올바른 것으로 보이는 것처럼 보이지만 프로그램이 다른 버전의 jar를 사용하고 있습니다. – user3709612

+0

@ user3709612 좋은 소식, 이제는 효과가 있습니까? –