<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; Atomikos</title>
	<atom:link href="https://blog.gmem.cc/tag/atomikos/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Fri, 03 Apr 2026 04:13:36 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>使用Atomikos来进行分布式事务(XA)开发</title>
		<link>https://blog.gmem.cc/jta-with-atomikos</link>
		<comments>https://blog.gmem.cc/jta-with-atomikos#comments</comments>
		<pubDate>Mon, 26 Nov 2012 10:16:53 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[ActiveMQ]]></category>
		<category><![CDATA[Atomikos]]></category>
		<category><![CDATA[JTA]]></category>
		<category><![CDATA[XA]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1141</guid>
		<description><![CDATA[<p>结合Spring使用 和Spring集成的时候，不需要JNDI服务器 注意，不支持Spring的事务传播性：PROPAGATION_NESTED JTA事务管理器配置样例： [crayon-69d2adf989261614668863/] 配合消息中间件使用（ActiveMQ）的配置样例： 3.9以前的版本，必须设置sessionTransacted为true [crayon-69d2adf989269566646147/] 配合数据库使用的配置样例： [crayon-69d2adf98926c938578764/] 不使用Spring，单独和Hibernate集成 Hibernate配置示例： [crayon-69d2adf989270864650075/] jndi.properties配置示例： [crayon-69d2adf989273231592315/] jta.properties配置示例： [crayon-69d2adf989275235070542/] 通过编程方式初始化数据源，并绑定到JNDI，进行编程式事务控制： [crayon-69d2adf989278967403766/] 一些常见问题 com.atomikos.icatch.RollbackException: Prepare: <a class="read-more" href="https://blog.gmem.cc/jta-with-atomikos">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/jta-with-atomikos">使用Atomikos来进行分布式事务(XA)开发</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div><span class="bh2">结合Spring使用</span></div>
和Spring集成的时候，不需要JNDI服务器<br />
注意，不支持Spring的事务传播性：PROPAGATION_NESTED<br />
JTA事务管理器配置样例：<br />
<pre class="crayon-plain-tag">&lt;bean id="localLogAdministrator" class="com.atomikos.icatch.admin.imp.LocalLogAdministrator" /&gt;
&lt;bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp" init-method="init"
    destroy-method="shutdownForce"&gt;
    &lt;constructor-arg&gt;
        &lt;!-- 配置Atomikos属性 --&gt;
        &lt;props&gt;
            &lt;prop key="com.atomikos.icatch.service"&gt;com.atomikos.icatch.standalone.UserTransactionServiceFactory&lt;/prop&gt;
        &lt;/props&gt;
    &lt;/constructor-arg&gt;
    &lt;property name="initialLogAdministrators"&gt;
        &lt;list&gt;
            &lt;ref bean="localLogAdministrator" /&gt;
        &lt;/list&gt;
    &lt;/property&gt;
&lt;/bean&gt;

&lt;!-- Atomikos 事务管理器配置 --&gt;
&lt;bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"
    depends-on="userTransactionService"&gt;
    &lt;property name="startupTransactionService" value="false" /&gt;
    &lt;!-- close()时是否强制终止事务 --&gt;
    &lt;property name="forceShutdown" value="false" /&gt;
&lt;/bean&gt;

&lt;!-- Atomikos UserTransaction配置 --&gt;
&lt;bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" depends-on="userTransactionService"&gt;
    &lt;property name="transactionTimeout" value="300" /&gt;
&lt;/bean&gt;

&lt;!-- JTA事务管理器 --&gt;
&lt;bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" depends-on="userTransactionService"&gt;
    &lt;property name="transactionManager" ref="atomikosTransactionManager" /&gt;
    &lt;property name="userTransaction" ref="atomikosUserTransaction" /&gt;
&lt;/bean&gt;</pre><br />
配合消息中间件使用（ActiveMQ）的配置样例：<br />
3.9以前的版本，必须设置sessionTransacted为true<br />
<pre class="crayon-plain-tag">&lt;bean id="xaFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory"&gt;
    &lt;property name="brokerURL" value="tcp://localhost:61616" /&gt;
&lt;/bean&gt;
&lt;bean id="jmsFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean" init-method="init" destroy-method="close"&gt;
    &lt;property name="uniqueResourceName" value="amq" /&gt;
    &lt;property name="xaConnectionFactory" ref="xaFactory" /&gt;
&lt;/bean&gt;
&lt;bean id="tipsMessageListener" class="cc.gmem.demo.TipsMessageListener" /&gt;
&lt;!-- 接收消息 --&gt;
&lt;jms:listener-container container-type="default" connection-factory="jmsFactory"
    transaction-manager="jtaTransactionManager" session-transacted="true"&gt;
    &lt;jms:listener destination="TIPS.10000.BATCH" ref="tipsMessageListener" method="onMessage" /&gt;
&lt;/jms:listener-container&gt;
&lt;!-- 发送消息 --&gt;
&lt;bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&gt;
    &lt;property name="connectionFactory"&gt;
        &lt;ref bean="jmsFactory" /&gt;
    &lt;/property&gt;
    &lt;property name="receiveTimeout" value="1000" /&gt;
    &lt;property name="sessionTransacted" value="true" /&gt;
&lt;/bean&gt;</pre><br />
配合数据库使用的配置样例：<br />
<pre class="crayon-plain-tag">&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;
    &lt;!-- 必须为Hibernate指定一个Atomikos JTA/XA 数据源 --&gt;
    &lt;property name="dataSource" ref="dataSource" /&gt;
&lt;/bean&gt;
&lt;bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"&gt;
    &lt;property name="sessionFactory" ref="sessionFactory" /&gt;
&lt;/bean&gt;
&lt;bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"&gt;
    &lt;property name="uniqueResourceName" value="mysqlDataSource" /&gt;
    &lt;property name="xaDataSourceClassName"&gt;
        &lt;value&gt;com.mysql.jdbc.jdbc2.optional.MysqlXADataSource&lt;/value&gt;
    &lt;/property&gt;
    &lt;property name="xaProperties"&gt;
        &lt;props&gt;
            &lt;prop key="databaseName"&gt;gmem&lt;/prop&gt;
            &lt;prop key="serverName"&gt;localhost&lt;/prop&gt;
            &lt;prop key="port"&gt;3306&lt;/prop&gt;
            &lt;prop key="user"&gt;user&lt;/prop&gt;
            &lt;prop key="password"&gt;pswd&lt;/prop&gt;
            &lt;prop key="url"&gt;jdbc:mysql://localhost:3306/gmem&lt;/prop&gt;
        &lt;/props&gt;
    &lt;/property&gt;
    &lt;property name="minPoolSize" value="10"&gt;
&lt;/bean&gt;
&lt;bean id="dataSourceOracle" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"&gt;
    &lt;property name="uniqueResourceName" value="oralceDataSource" /&gt;
    &lt;property name="xaDataSourceClassName"&gt;
        &lt;value&gt;oracle.jdbc.xa.client.OracleXADataSource&lt;/value&gt;
    &lt;/property&gt;
    &lt;property name="xaProperties"&gt;
        &lt;props&gt;
            &lt;prop key="user"&gt;gmemx&lt;/prop&gt;
            &lt;prop key="password"&gt;pswd&lt;/prop&gt;
            &lt;prop key="URL"&gt;jdbc:oracle:thin:@192.168.0.25:1521:DEV&lt;/prop&gt;
        &lt;/props&gt;
    &lt;/property&gt;
&lt;/bean&gt;</pre>
<div><span class="bh2">不使用Spring，单独和Hibernate集成</span></div>
Hibernate配置示例：<br />
<pre class="crayon-plain-tag">&lt;?xml version='1.0' encoding='utf-8'?&gt;
&lt;!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;

&lt;hibernate-configuration&gt;

    &lt;session-factory&gt;
    	&lt;property name="connection.datasource"&gt;ds0&lt;/property&gt;
        &lt;property name="dialect"&gt;org.hibernate.dialect.MySQL5Dialect&lt;/property&gt;

        &lt;property name="current_session_context_class"&gt;jta&lt;/property&gt;
		&lt;property name="transaction.manager_lookup_class"&gt;com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup&lt;/property&gt;
 		&lt;property name="transaction.factory_class"&gt;org.hibernate.transaction.JTATransactionFactory&lt;/property&gt;
        &lt;property name="connection.release_mode"&gt;auto&lt;/property&gt;

        &lt;property name="cache.provider_class"&gt;org.hibernate.cache.NoCacheProvider&lt;/property&gt;
        &lt;property name="show_sql"&gt;true&lt;/property&gt;

        &lt;mapping resource="cc/gmem/demo/vo/User.hbm.xml"/&gt;
    &lt;/session-factory&gt;

&lt;/hibernate-configuration&gt;</pre><br />
jndi.properties配置示例：<br />
<pre class="crayon-plain-tag">java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory</pre><br />
jta.properties配置示例：<br />
<pre class="crayon-plain-tag">com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.automatic_resource_registration=true
com.atomikos.icatch.console_log_level=DEBUG</pre><br />
通过编程方式初始化数据源，并绑定到JNDI，进行编程式事务控制：<br />
<pre class="crayon-plain-tag">import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.transaction.UserTransaction;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.atomikos.jdbc.SimpleDataSourceBean;

Context ctx = new InitialContext();
SimpleDataSourceBean ds0 = new SimpleDataSourceBean();
ds0.setUniqueResourceName("ds0");
ds0.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
ds0.setXaDataSourceProperties("databaseName=gmem");
ds0.setConnectionPoolSize(10);
ctx.rebind("ds0", ds0);

SimpleDataSourceBean ds1 = = new SimpleDataSourceBean();
ds0.setUniqueResourceName("ds1");
ds0.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
ds0.setXaDataSourceProperties("databaseName=gmembkp");
ds0.setConnectionPoolSize(10);
ctx.rebind("ds1", ds1);
ctx.close();

UserTransaction tx = new com.atomikos.icatch.jta.UserTransactionImp();

SessionFactory sf0 = new Configuration().configure("/hibernate0.cfg.xml").buildSessionFactory();
SessionFactory sf1 = new Configuration().configure("/hibernate1.cfg.xml").buildSessionFactory();

tx.setTransactionTimeout(60);
tx.begin();

try {
	//执行DML操作
	userTransaction.commit();
}
catch (Exception ex) {
	tx.rollback();
}

sf0.close();
sf1.close();
ds0.close();
ds1.close();</pre>
<div><span class="bh2">一些常见问题</span></div>
<div><span class="bh3">com.atomikos.icatch.RollbackException: Prepare: NO vote</span></div>
<p>详细参考：http://www.atomikos.com/Documentation/JtaProperties<br />
注意事务的超时设置：UserTransaction.setTransactionTimeout()<br />
另外，超时设置无法超过最大值限制：jta.properties中的com.atomikos.icatch.max_timeout</p>
<div><span class="bh3">Oracle 9.2.0.8.0版本下操作blob导致挂起（Halt）</span></div>
<p>10.x驱动无该问题，可能Oracle驱动的bug。INSERT时没有问题，UPDATE时，如果1个blob也没问题，2个就挂起。<br />
可以禁用Hibernate批量操作来临时解决：jdbc.batch_size=0</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/jta-with-atomikos">使用Atomikos来进行分布式事务(XA)开发</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/jta-with-atomikos/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
