我正在测试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来调用db。我得到了同样的错误,我厌倦了检查StateRecoveryManagerImp
在线的代码,我看到了定义的init方法。我不知道是什么导致了这个问题。我只是尝试了数据库的东西,它工作得很好,我能够执行查询并获得结果。
我试过使用各种版本的atomikos罐子,但没有运气。对如何解决这个问题有什么建议吗?
发布于 2017-01-18 19:34:47
您得到的例外是:
com.atomikos.persistence.imp.StateRecoveryManagerImp:方法()NoSuchMethodError ()V未找到
这意味着它在运行时尝试访问类StateRecoveryManagerImp
的默认构造函数(没有参数的构造函数),却找不到它。
当您使用库的一个版本构建应用程序并针对不兼容的不同版本运行应用程序时,这通常是一个异常。
在这里,我从源代码中可以看到,我认为您编译代码时使用的是transactions
3.9.0
或更高版本,它没有定义构造函数--这意味着我们有默认构造函数(正如您可以看到的这里);您的应用程序在运行时使用的是一个旧版本,它有一个类型为public StateRecoveryManagerImp ( ObjectLog objectlog )
的构造函数,这意味着我们没有默认的构造函数(如您可以看到的这里),因此当它尝试在运行时调用它时,它会失败。
要解决问题,只需检查运行时使用的类路径,并确保只有与编译时使用的版本相对应的transactions
版本。
https://stackoverflow.com/questions/41726828
复制相似问题