[Seasar-user:21744] S2JDBC MySQL 2フェーズコミット
[E-MAIL ADDRESS DELETED]
[E-MAIL ADDRESS DELETED]
2013年 10月 22日 (火) 18:56:41 JST
川島といいます。お世話になります。
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 メーリングリストの案内