[Seasar-user:21746] Re: S2JDBC MySQL 2フェーズコミット

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2013年 10月 23日 (水) 09:14:20 JST


小林 (koichik)さま

早速のレス有難うございます。

> これは本物のXAConnectionではなく、本当に
> 2フェーズコミットを行うわけでもありません。
そうなんですね。了解しました。
jbossなどのJ2EEサーバーを使わずにできるかと
思っていました。

> relaxAutoCommitがtrueなのはなぜでしょう?
深い意図はありません。色々と試しているうちに、
残ってしまいました。
余計なものを提示してしまいすみません。

別途、J2EEサーバーを用いて試してみようと思います。
J2EEサーバーは使用したことが無いので時間がかかって
しまうと思いますが、別途報告したいと思います。

ありがとうございました。


----- Original Message -----
> 小林 (koichik) です。
> 
> > xaDataSource:org.seasar.extension.dbcp.impl.XADataSourceImpl
> 
> これは本物のXAConnectionではなく、本当に
> 2フェーズコミットを行うわけでもありません。
> なので、
> 
> > この時、host2のテーブルはコミット?(データが挿入)されてしまいます。
> 
> ということは普通に起こり得ます。
> 実際は、DataSourceがトランザクションマネージャに
> 登録される順番に依存します。
> 
> ・先に登録された方の接続先が障害になった場合は、
>   後から登録された方のDataSourceはコミットされる
> ・後から登録された方の接続先が障害になった場合は、
>   先に登録された方のDataSourceはロールバックされる
> 
> だったようなかすかな記憶が。。。
> 
> > xaDataSource:com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
> 
> relaxAutoCommitがtrueなのはなぜでしょう?
> ドキュメント眺めた限り、これをtrueにしなくては
> いけないようだと、サーバ側がそもそもトランザクション
> 制御できない状況みたいですが。
> 
> 
> 
> On Tue, 22 Oct 2013 18:56:41 +0900, <kawashimat @ nexus21.co.jp> wrote:
> 
> > 川島といいます。お世話になります。
> > 
> > 2フェーズコミットのテストとして、
> > host1(java バッチ)から、host2、host3のMySQLサーバーに
> > S2JDBCを使用して、insertしようとしてます。
> > 
> > テストとしては、Eclipseを使用して、
> > 0.Eclipse上でbreak pointをコミットの直前に設定
> > 1.host2のテーブルをinsert
> > 2.host2のテーブルをselectして確認
> > 3.host3のテーブルをinsert
> > 4.host3のテーブルをselectして確認
> > 5.break pointで止まったことを確認
> > 6.host3のMySQLを終了
> > 7.Eclipseでコミットを実行
> > 8.catchの処理の中でロールバックを実行
> > 
> > を行っています。
> > 
> > 
> > ケース1
> > jdbc.diconの設定
> > xaDataSource:org.seasar.extension.dbcp.impl.XADataSourceImpl
> > driverClassName:com.mysql.jdbc.Driver
> > 
> > 7.のところでexceptionが出力され、8.catchの処理へ
> > 8.のロールバックでexceptionが出力され、トランザクションが無い旨
> > のexceptionが出力される
> > 
> > この時、host2のテーブルはコミット?(データが挿入)されてしまいます。
> > 
> > MySQLサーバーのautocommitはoffにしています。
> >  SELECT @ @autocommitの結果は「0」です。
> > JDBCドライバのjarは、mysql-connector-java-5.1.23-bin.jarです。
> > 
> > 
> > ケース2
> > jdbc.diconの設定
> > xaDataSource:com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
> > 
> > 7.のところで、exceptionが発生せず、正常にcommitされ、レコード
> > がinsertされてしまいます。
> > なので、commitの部分をrollbackに置き換え実験したところ、
> > rollbackせずに、commitされてしまいます。
> > 
> > 
> > 正しい設定方法が分からず困っています。
> > どなたか、ご教授いただけないでしょうか。
> > よろしくお願いします。
> > 
> > 
> > 以下、設定ファイル、ソースです。
> > 
> > s2jdbc.dicon
> > <components>
> >     <include path="s2jdbcxp3.dicon"/>
> >     <include path="s2jdbcxp4.dicon"/>
> > </components>
> > 
> > s2jdbcxp3.dicon
> > <components namespace="s2jdbcxp3">
> > 	<include path="jdbcxp3.dicon"/>
> > 	<include path="s2jdbc-internal.dicon"/>
> > 	<component name="jdbcManagerXP3" class="org.seasar.extension.jdbc.
> > manager.JdbcManagerImpl">
> > 		<property name="maxRows">0</property>
> > 		<property name="fetchSize">0</property>
> > 		<property name="queryTimeout">0</property>
> > 		<property name="dialect">mysqlDialect</property>
> > 	</component>
> > </components>
> > 
> > s2jdbcxp4.dicon
> > <components namespace="s2jdbcxp4">
> > 	<include path="jdbcxp4.dicon"/>
> > 	<include path="s2jdbc-internal.dicon"/>
> > 	<component name="jdbcManagerXP4" class="org.seasar.extension.jdbc.
> > manager.JdbcManagerImpl">
> > 		<property name="maxRows">0</property>
> > 		<property name="fetchSize">0</property>
> > 		<property name="queryTimeout">0</property>
> > 		<property name="dialect">mysqlDialect</property>
> > 	</component>
> > </components>
> > 
> > jdbcxp3.dicon(ケース1)
> > <components namespace="jdbc">
> > 	<include path="jta.dicon"/>
> > 
> > 	<component name="xaDataSource"
> > 		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
> > 		<property name="driverClassName">
> > 			"com.mysql.jdbc.Driver"
> > 		</property>
> > 		<property name="URL">
> > 		"jdbc:mysql://xp3/xxxxx?characterEncoding=utf8"
> > 		</property>
> > 		<property name="user">"user"</property>
> > 		<property name="password">"password"</property>
> > 	</component>
> > 
> > 	<component name="connectionPool"
> > 		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
> > 		<property name="timeout">600</property>
> > 		<property name="maxPoolSize">10</property>
> > 		<property name="allowLocalTx">true</property>
> > 		<destroyMethod name="close"/>
> > 	</component>
> > 
> > 	<component name="DataSource"
> > 		class="org.seasar.extension.dbcp.impl.DataSourceImpl"
> > 	/>
> > </components>
> > 
> > jdbcxp3.dicon(ケース2)
> > <components namespace="jdbc">
> > 	<include path="jta.dicon"/>
> > 
> > 	<component name="xaDataSource"
> > 		class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource">
> > 		<property name="URL">
> > 		"jdbc:mysql://xp3/xxxxx?characterEncoding=utf8"
> > 		</property>
> > 		<property name="user">"user"</property>
> > 		<property name="password">"password"</property>
> > 		<property name="relaxAutoCommit">true</property>
> > 	</component>
> > 
> > 	<component name="connectionPool"
> > 		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
> > 		<property name="timeout">600</property>
> > 		<property name="maxPoolSize">10</property>
> > 		<property name="allowLocalTx">true</property>
> > 		<destroyMethod name="close"/>
> > 	</component>
> > </components>
> > 
> > jdbcxp4.dicon(ケース1)
> > <components namespace="jdbc">
> > 	<include path="jta.dicon"/>
> > 
> > 	<component name="xaDataSource"
> > 		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
> > 		<property name="driverClassName">
> > 			"com.mysql.jdbc.Driver"
> > 		</property>
> > 		<property name="URL">
> > 		"jdbc:mysql://xp4/xxxxx?characterEncoding=utf8"
> > 		</property>
> > 		<property name="user">"user"</property>
> > 		<property name="password">"password"</property>
> > 	</component>
> > 
> > 	<component name="connectionPool"
> > 		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
> > 		<property name="timeout">600</property>
> > 		<property name="maxPoolSize">10</property>
> > 		<property name="allowLocalTx">true</property>
> > 		<destroyMethod name="close"/>
> > 	</component>
> > 
> > 	<component name="DataSource"
> > 		class="org.seasar.extension.dbcp.impl.DataSourceImpl"
> > 	/>
> > </components>
> > 
> > jdbcxp4.dicon(ケース2)
> > <components namespace="jdbc">
> > 	<include path="jta.dicon"/>
> > 
> > 	<component name="xaDataSource"
> > 		class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource">
> > 		<property name="URL">
> > 		"jdbc:mysql://xp4/xxxxx?characterEncoding=utf8"
> > 		</property>
> > 		<property name="user">"user"</property>
> > 		<property name="password">"password"</property>
> > 		<property name="relaxAutoCommit">true</property>
> > 	</component>
> > 
> > 	<component name="connectionPool"
> > 		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
> > 		<property name="timeout">600</property>
> > 		<property name="maxPoolSize">10</property>
> > 		<property name="allowLocalTx">true</property>
> > 		<destroyMethod name="close"/>
> > 	</component>
> > </components>
> > 
> > 
> > テスト用のjavaソース(パッケージは変えています)
> > package kawa.batch;
> > 
> > import java.util.List;
> > 
> > import javax.transaction.NotSupportedException;
> > import javax.transaction.SystemException;
> > import javax.transaction.TransactionManager;
> > 
> > import kawa.entity.MClient;
> > 
> > import org.apache.log4j.Logger;
> > import org.seasar.extension.jdbc.JdbcManager;
> > import org.seasar.extension.jdbc.manager.JdbcManagerImpl;
> > import org.seasar.extension.jta.TransactionManagerImpl;
> > import org.seasar.framework.container.SingletonS2Container;
> > import org.seasar.framework.container.factory.
> > SingletonS2ContainerFactory;
> > 
> > public class Test2phaseCommit {
> > 
> > 	private Logger _log;
> > 
> > 	private TransactionManager transactionManager;
> > 
> > 	private JdbcManager jdbcManagerXP3;
> > 	private JdbcManager jdbcManagerXP4;
> > 
> > 	public static void main(String[] args) throws NotSupportedException,
 
> > SystemException {
> > 		Test2phaseCommit test = new Test2phaseCommit();
> > 		test.init(args);
> > 		test.exec(args);
> > 
> > 	}
> > 
> > 	private void init(String[] args){
> > 		_log = Logger.getLogger(this.getClass());
> > 		_log.debug("===== init =====");
> > 
> > 		SingletonS2ContainerFactory.init();
> > 
> > 		transactionManager = (TransactionManagerImpl)SingletonS2Container.
> > getComponent("TransactionManager");
> > 		jdbcManagerXP3 = (JdbcManagerImpl)SingletonS2Container.
getComponent("
> > jdbcManagerXP3");
> > 		jdbcManagerXP4 = (JdbcManagerImpl)SingletonS2Container.
getComponent("
> > jdbcManagerXP4");
> > 	}
> > 
> > 	private void exec(String[] args){
> > 		_log.debug("===== exec =====");
> > 
> > 		insert();
> > 
> > 	}
> > 
> > 	private void insert(){
> > 		_log.debug("===== insert =====");
> > 
> > 		MClient entity = new MClient();
> > 		entity.clientName = "insert";
> > 		entity.zip ="000-0000";
> > 		entity.address = "有楽町1−1";
> > 		entity.tel = "03-0000-0000";
> > 
> > 		try {
> > 			transactionManager.begin();
> > 			jdbcManagerXP3.insert(entity).execute();
> > 			jdbcManagerXP4.insert(entity).execute();
> > 
> > 
> > 
> > 			List<MClient> lstXP3 = jdbcManagerXP3.selectBySql(MClient.class, 
"
> > select * from m_client").getResultList();
> > 			_log.info("===== XP3 start =====");
> > 			for(MClient entXP3 : lstXP3){
> > 				String str = new StringBuilder().append(" id:").append(entXP3.id)
> > 						.append(" 取引先名:").append(entXP3.clientName)
> > 						.append(" 郵便番号:").append(entXP3.zip)
> > 						.append(" 住所:").append(entXP3.address)
> > 						.append(" 電話番号:").append(entXP3.tel)
> > 						.toString();
> > 				_log.info(str);
> > 			}
> > 			_log.info("===== XP3 end =====");
> > 
> > 			List<MClient> lstXP4 = jdbcManagerXP4.selectBySql(MClient.class, 
"
> > select * from m_client").getResultList();
> > 			_log.info("===== XP4 start =====");
> > 			for(MClient entXP4 : lstXP4){
> > 				String str = new StringBuilder().append(" id:").append(entXP4.id)
> > 						.append(" 取引先名:").append(entXP4.clientName)
> > 						.append(" 郵便番号:").append(entXP4.zip)
> > 						.append(" 住所:").append(entXP4.address)
> > 						.append(" 電話番号:").append(entXP4.tel)
> > 						.toString();
> > 				_log.info(str);
> > 			}
> > 			_log.info("===== XP4 end =====");
> > 
> > 
> > 
> > 			transactionManager.rollback();
> > //			transactionManager.commit();
> > 		} catch (Exception e) {
> > 			try {
> > 				transactionManager.rollback();
> > 			} catch (Exception e1) {
> > 				e1.printStackTrace();
> > 			}
> > 		}
> > 
> > 	}
> > 
> > }
> > 
> > 
> > 
> > _______________________________________________
> > Seasar-user mailing list
> > Seasar-user @ ml.seasar.org
> > https://ml.seasar.org/mailman/listinfo/seasar-user
> 
> 
> -- 
> {
>   name: "Koichi Kobayashi",
>   mail: "koichik @ improvement.jp",
>   blog: "http://d.hatena.ne.jp/koichik/",
>   twitter: "@koichik"
> }
> 
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user
> 




Seasar-user メーリングリストの案内