使用此配置(MainConfig.java):
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.jta.JtaTransactionManager;
import com.atomikos.icatch.jta.UserTransactionImp;
import com.atomikos.icatch.jta.UserTransactionManager;
@Configuration
@ComponentScan
public class MainConfig {
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
hibernateJpaVendorAdapter.setShowSql(true);
hibernateJpaVendorAdapter.setGenerateDdl(true);
hibernateJpaVendorAdapter.setDatabase(Database.MYSQL);
return hibernateJpaVendorAdapter;
}
@Bean(name = "userTransaction")
public UserTransaction userTransaction() throws Throwable {
UserTransactionImp userTransactionImp = new UserTransactionImp();
userTransactionImp.setTransactionTimeout(10000);
return userTransactionImp;
}
@Bean(name = "atomikosTransactionManager", initMethod = "init", destroyMethod = "close")
public TransactionManager atomikosTransactionManager() throws …
Run Code Online (Sandbox Code Playgroud) 我从Hibernate 4.2切换到Hibernate 4.3,我的项目不再工作了.我得到了一个
HibernateException:无法找到当前的JTA事务
当我做
Session s = sessionFactory.getCurrentSession();
Run Code Online (Sandbox Code Playgroud)
我意识到org.hibernate.transaction.TransactionManagerLookup不再存在.它在Hibernate 4.3中被删除了.我该如何更改当前配置?
<hibernate-configuration>
<session-factory>
<property name="connection.datasource">testDS</property>
<property name="current_session_context_class">jta</property>
<property name="transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</property>
<property name="transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>
<property name="connection.release_mode">auto</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<property name="hibernate.show_sql">true</property>
<mapping class="test.entities.Person" />
<mapping class="test.entities.CreditCard" />
<mapping class="test.entities.ExampleRevEntity" />
</session-factory>
Run Code Online (Sandbox Code Playgroud)
我们试图在几个本地环境中运行使用Atomikos作为事务管理器的相同Web应用程序(每个环境使用相同版本的spring,atomikos,tomact等,使用相同的配置文件).其中一些工作正常,但在其中一个中,当我们尝试启动tomcat时,我们得到以下异常:
Caused by: java.lang.IllegalStateException: Can't overwrite cause with java.lang.RuntimeException: Log already in use?
at java.lang.Throwable.initCause(Throwable.java:456)
at com.atomikos.icatch.standalone.UserTransactionServiceImp.init(UserTransactionServiceImp.java:326)
at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:405)
at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:569)
at com.atomikos.icatch.jta.UserTransactionManager.startupTransactionService(UserTransactionManager.java:89)
at com.atomikos.icatch.jta.UserTransactionManager.checkSetup(UserTransactionManager.java:77)
at com.atomikos.icatch.jta.UserTransactionManager.init(UserTransactionManager.java:142)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1638)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1579)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509)
... 41 more
Caused by: com.atomikos.icatch.SysException: Error in init(): Log already in use?
... 54 more
Caused by: java.lang.RuntimeException: Log already in use?
at com.atomikos.icatch.standalone.UserTransactionServiceImp.createDefault(UserTransactionServiceImp.java:203)
at com.atomikos.icatch.standalone.UserTransactionServiceImp.init(UserTransactionServiceImp.java:258)
Run Code Online (Sandbox Code Playgroud)
我们无法弄清楚有问题的日志是什么,谷歌也没有多大帮助......任何人都知道这个奇怪问题的原因是什么?同样,我们的环境具有完全相同的配置,可以正常工作,另一个环境有另一个奇怪的警告:https: //stackoverflow.com/questions/20936253/atomikos-with-activemq-commit-heuristic-warnings
谢谢!:)
我正在运行一个使用Atomikos的J2SE应用程序,它将许多日志文件转储到当前目录.我想将这些文件的位置移动到"/ tmp",但我无法找到我可以在Spring XML配置文件中设置的配置属性.
Atomikos文档引用了一个属性:
com.atomikos.icatch.output_dir
Run Code Online (Sandbox Code Playgroud)
这似乎正是我需要的,但如何从没有jta.properties文件的Spring设置?这是我的事务管理器配置:
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<!-- When close is called, should we force transactions to terminate? -->
<property name="forceShutdown" value="false" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<!-- Number of seconds before transaction timesout. -->
<property name="transactionTimeout" value="30" />
</bean>
Run Code Online (Sandbox Code Playgroud) 当我尝试启动在apache下运行的java spring软件时,我收到以下错误: -
Sep 24, 2012 12:08:20 PM org.apache.catalina.core.StandardContext start
SEVERE: Error listenerStart
Sep 24, 2012 12:08:20 PM org.apache.catalina.core.StandardContext start
SEVERE: Context [/jw] startup failed due to previous errors
Sep 24, 2012 12:08:21 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive jwdesigner.war
Sep 24, 2012 12:08:21 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Sep 24, 2012 12:08:21 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
Sep 24, 2012 12:08:21 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/16 …
Run Code Online (Sandbox Code Playgroud) 我有一个带有3个分布式dataSources的应用程序(com.atomikos.jdbc.AtomikosDataSourceBean).我正在使用Atomikos事务管理器作为JTA实现.每个dataSource都适用于PostgreSQL数据库.现在,我正在调用我对每个dataSource的查询,一切正常.
我想知道,如果有可能,使用JTA,并行调用我的查询(多线程,并发)?
我试过简单地使用jdbcTemplate(Spring)在新创建的线程中调用查询.首先,我遇到了一个春天问题.Spring将事务上下文存储在ThreadLocal字段中,因此在我的新线程中无法正确解析(Spring事务管理器和多线程)).我已经通过将相同的事务上下文设置为新创建的线程的ThreadLocal来解决了这个问题.但是我在Atomikos代码中面临同样的问题.它们还将CompositeTransactionImp存储在线程范围映射(BaseTrancationManager#getCurrentTx)中.但在Atomikos案例中,不可能为新线程设置值.所以我不能同时执行我的查询,因为似乎Atomikos不支持这种方法.但我也查看了JTA规范并发现了以下内容:"多个线程可能同时与同一个全局事务关联." ("3.2 TransactionManager接口",http://download.oracle.com/otndocs/jcp/jta-1.1-spec-oth-JSpec/?submit=Download)
问题:如何在一个全局事务的范围内使用JTA(2阶段提交)同时调用两个或多个查询到不同的dataSource?
在tomcat上下文中配置DataSources:
<Resource name="jdbc/db1" auth="Container" type="com.atomikos.jdbc.AtomikosDataSourceBean"
factory="com.company.package.AtomikosDataSourceBeanFactory"
xaDataSourceClassName="org.postgresql.xa.PGXADataSource"
xaProperties.serverName="localhost"
xaProperties.portNumber="5451"
xaProperties.databaseName="db1"
uniqueResourceName="jdbc/db1"
xaProperties.user="secretpassword"
xaProperties.password="secretpassword"
minPoolSize="5"
maxPoolSize="10"
testQuery="SELECT 1" />
<Resource name="jdbc/db2" auth="Container" type="com.atomikos.jdbc.AtomikosDataSourceBean"
factory="com.company.package.AtomikosDataSourceBeanFactory"
xaDataSourceClassName="org.postgresql.xa.PGXADataSource"
xaProperties.serverName="localhost"
xaProperties.portNumber="5451"
xaProperties.databaseName="db2"
uniqueResourceName="jdbc/db2"
xaProperties.user="secretpassword"
xaProperties.password="secretpassword"
minPoolSize="5"
maxPoolSize="10"
testQuery="SELECT 1" />
<Resource name="jdbc/db3" auth="Container" type="com.atomikos.jdbc.AtomikosDataSourceBean"
factory="com.company.package.AtomikosDataSourceBeanFactory"
xaDataSourceClassName="org.postgresql.xa.PGXADataSource"
xaProperties.serverName="localhost"
xaProperties.portNumber="5451"
xaProperties.databaseName="db3"
uniqueResourceName="jdbc/db3"
xaProperties.user="secretpassword"
xaProperties.password="secretpassword"
minPoolSize="5"
maxPoolSize="10"
testQuery="SELECT 1" />
Run Code Online (Sandbox Code Playgroud)
Spring环境中的事务管理器配置:
<bean id="transactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close" lazy-init="true">
<property name="forceShutdown" value="false" />
</bean>
Run Code Online (Sandbox Code Playgroud)
码:
final SqlParameterSource parameters = …
Run Code Online (Sandbox Code Playgroud) 我想了解如果我设置了分布式事务功能是否适用于我的应用程序 com.atomikos.icatch.enable_logging=false
com.atomikos.icatch.enable_logging=false
com.atomikos.icatch.enable_logging=false
如果并非所有分布式事务的参与者都已提交,则可能导致数据库的状态不一致?更新 我在这个问题之后被触发,以便更多地了解我在这里描述的分布式事务的内部结构: 如何调整分布式(XA)事务的性能?
我在本地postgres.config中将'max_prepared_transactions'设置为20,但事务失败并出现以下错误跟踪(但仅限在Linux上).因为在Windows中,相同的代码无缝地工作,如果这不是许可问题,我就会徘徊.什么是解决方案?谢谢彼得
372300 [Atomikos:7] WARN atomikos - XA resource 'XADBMS': rollback for XID '3137332E3230332E3132362E3139302E746D30303030313030303037:3137332E3230332E3132362E3139302E746D31' raised -3: the XA resource detected an internal error org.postgresql.xa.PGXAException: Error rolling back prepared transaction at org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:357) at com.atomikos.datasource.xa.XAResourceTransaction.rollback(XAResourceTransaction.java:873) at com.atomikos.icatch.imp.RollbackMessage.send(RollbackMessage.java:90) at com.atomikos.icatch.imp.PropagationMessage.submit(PropagationMessage.java:86) at com.atomikos.icatch.imp.Propagator$PropagatorThread.run(Propagator.java:62) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676) at java.lang.Thread.run(Thread.java:595) Caused by: org.postgresql.util.PSQLException: ERROR: prepared transaction with identifier "1096044365_MTczLjIwMy4xMjYuMTkwLnRtMDAwMDEwMDAwNw==_MTczLjIwMy4xMjYuMTkwLnRtMQ==" does not exist at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:299) at org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:347)
我试图了解使远程/网络资源符合 JTA 的基本原则,但我对有关该主题的文档/博客/文章如此之少感到震惊。
假设我编写了自己的特殊类型的服务器,即“ IAmYourFaja ”服务器或“ IAYF ”。假设我编写/实现了我自己的基于 TCP 的网络协议,用于与该服务器进行交互,称为 IAYFCP(IAYF 通信协议)。最后,我编写了一个 Java 客户端库,用于通过 IAYFCP 访问和发送消息到远程 IAYF 服务器。还在我这儿?
现在我有一个用例,我需要执行以下分布式事务:
我需要所有这些进行交易,这样如果任何一个组件在任何时候出现故障,我都可以将它们全部回滚,并且这些网络资源中的状态不会发生任何改变。
最终目标是能够运行以下代码(此处为伪代码):
// "JTA Example"
DistributedTransaction dTrans = getTransaction();
DataSource jdbcDataSource = getDataSource();
IayfClient iayfClient = getIayfClient();
JmsClient jmsClient = getJmsClient();
try {
dTrans.begin();
// 1. Insert a record in a relational/JDBC database
insertRecord(jdbcDataSource, "INSERT INTO widgets ( fizz, buzz ) VALUES ( 35, true )");
// 2. Fire a message …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Atomikos 进行 JTA 事务。我对 JTA 有以下设置:
UserTransactionImp userTransactionImp = new UserTransactionImp();
userTransactionImp.setTransactionTimeout(900);
Run Code Online (Sandbox Code Playgroud)
但是当我的代码执行 JTA 事务时,如果它需要超过 5 分钟(这是默认值),那么它会抛出异常:
Caused by: com.atomikos.icatch.RollbackException: Prepare: NO vote
at com.atomikos.icatch.imp.ActiveStateHandler.prepare(ActiveStateHandler.java:231)
at com.atomikos.icatch.imp.CoordinatorImp.prepare(CoordinatorImp.java:681)
at com.atomikos.icatch.imp.CoordinatorImp.terminate(CoordinatorImp.java:970)
at com.atomikos.icatch.imp.CompositeTerminatorImp.commit(CompositeTerminatorImp.java:82)
at com.atomikos.icatch.imp.CompositeTransactionImp.commit(CompositeTransactionImp.java:336)
at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:190)
... 25 common frames omitted
Run Code Online (Sandbox Code Playgroud)
看起来它采用了默认的 jta 事务超时(即使我明确地设置了超时(到 15 分钟/900 秒)。
我尝试在 application.properties 文件中使用以下属性,但它仍然采用默认超时值(300 秒)。
spring.jta.atomikos.properties.max-timeout=600000
spring.jta.atomikos.properties.default-jta-timeout=10000
Run Code Online (Sandbox Code Playgroud)
我也尝试过以下属性,但没有运气:
spring.transaction.default-timeout=900
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议我是否需要任何其他设置?我正在使用 wildfly 插件、spring boot 和 atomikos api 进行 JTA 事务。
atomikos ×10
jta ×5
java ×4
spring ×2
xa ×2
bitronix ×1
catalina ×1
database ×1
hibernate ×1
logging ×1
postgresql ×1
spring-boot ×1
tomcat ×1
transactions ×1