2017-01-18 105 views
0

我測試了Atomikos公司事務和數據庫連接東西無法開始使用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")); 
     } 

    } 
} 

但我得到一個錯誤,

一個UserTransaction,作爲它的一部分,我試圖執行下面的代碼,
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) 

我試圖通過將atomikos與tomcat集成並調用一個調用db的servlet來執行相同的操作。我得到了同樣的錯誤,我厭倦了檢查在線的StateRecoveryManagerImp的代碼,我看到了定義的init方法。我不確定是什麼導致了這個問題。我嘗試了數據庫的東西,它工作正常,我能夠執行查詢並獲得結果。

我嘗試過使用各種版本的atomikos罐子,但沒有運氣。有關如何解決這個問題的任何建議?

回答

0

,你得到是唯一的例外:

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

意味着,它試圖在運行時類StateRecoveryManagerImp的訪問的默認構造函數(構造函數不帶參數),它不能找到它。

這是一個典型的例外情況,當您使用一個版本的庫構建應用程序時遇到的問題,並針對不兼容的不同版本運行該應用程序。

這裏,據我可以從源代碼中看到的,我相信你transactions3.9.0或更高版本編譯的代碼是沒有定義的構造,這意味着我們有默認的構造函數(因爲你可以看到here),和你的應用程序在運行時使用了一箇舊版本,它有一個類型爲public StateRecoveryManagerImp (ObjectLog objectlog)的構造函數,這意味着我們沒有默認構造函數(因爲你可以看到here),所以當它試圖在運行時調用它時會失敗。

要解決您的問題,只需檢查您在運行時使用的類路徑,並確保您只有對應於編譯時使用的版本transactions

+0

感謝您的輸入,我驗證了我的罐子,看起來像您所說的是正確的,在運行時,程序使用的是不同版本的罐子。 – user3709612

+0

@ user3709612好消息,所以現在它工作? –