【问题标题】:Unable to start a UserTransaction using Atomikos无法使用 Atomikos 启动 UserTransaction
【发布时间】:2017-01-18 18:28:13
【问题描述】:

我正在测试 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)

我尝试通过将 atomikos 与 tomcat 集成并调用调用数据库的 servlet 来执行相同的操作。我遇到了同样的错误,我厌倦了在线检查StateRecoveryManagerImp 的代码,我看到了定义的init 方法。我不确定是什么导致了这个问题。我只尝试了数据库的东西,它运行良好,我也能够执行查询并获得结果。

我尝试使用各种版本的 atomikos jar,但没有成功。有关如何解决此问题的任何建议?

【问题讨论】:

    标签: java transactions atomikos


    【解决方案1】:

    你得到的例外是:

    NoSuchMethodError: com.atomikos.persistence.imp.StateRecoveryManagerImp:方法()V 没找到

    表示它在运行时尝试访问StateRecoveryManagerImp类的默认构造函数(没有参数的构造函数),但找不到。

    当您使用库的一个版本构建应用程序并针对不兼容的不同版本运行它时,通常会遇到这种异常。

    据我从源代码中可以看出,我相信您使用 transactions 3.9.0 或更高版本编译了您的代码,没有定义构造函数,这意味着我们有默认构造函数(如您所见 @ 987654321@),并且您的应用程序在运行时使用旧版本,该版本具有public StateRecoveryManagerImp ( ObjectLog objectlog ) 类型的构造函数,这意味着我们没有默认构造函数(如您所见here),因此当它尝试在运行时调用它时会失败.

    要解决您的问题,只需检查您在运行时使用的类路径,并确保您只有与编译时使用的版本相对应的transactions 版本。

    【讨论】:

    • 感谢您的输入,我验证了我的 jar,看起来您说的是正确的,在运行时,程序正在使用不同版本的 jar。
    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 2012-08-08
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2018-03-31
    • 2016-08-19
    相关资源
    最近更新 更多