two phase commit with S2Dao - その後 -

できました(^^)
ドキュメントを見つけられなかったので、サンプルコードとソースコード、S2DBCPのテストコードを参考にして動作確認をとることができました。

動作確認に使ったのは、S2 2.2.9,S2Dao 1.0.26です。

結局わかったのは、j2ee.dicon,dao.dicon,各Daoのdiconで、以下の流れで関連付けるってことでした。

Daoクラス(Daoのdiconファイル)
<= S2DaoInterceptor(dao.dicon)
<= DaoMetaDataFactory(dao.dicon)
<= DataSource(j2ee.dicon)
<= ConnectionPool(j2ee.dicon)
<= XADataSource, TransactionManager(j2ee.dicon)


以下、S2Daoのサンプルを分散DB対応に設定変更してみた例。

j2ee.dicon

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components namespace="j2ee">
	<component name="transactionManager"
		class="org.seasar.extension.jta.TransactionManagerImpl"/>
	<component name="requiredTx"
		class="org.seasar.extension.tx.RequiredInterceptor"/>
	<component name="requiresNewTx"
		class="org.seasar.extension.tx.RequiresNewInterceptor"/>
	<component name="mandatoryTx"
		class="org.seasar.extension.tx.MandatoryInterceptor"/>
		
	<component name="brsf" class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
	<component name="bsf" class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
	
         <!-- DBサーバー その1 -->
	<component name="xaDataSource"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">
			"org.hsqldb.jdbcDriver"
		</property>
		<property name="URL">
			"jdbc:hsqldb:hsql://localhost:9001"
		</property>
		<property name="user">"sa"</property>
		<property name="password">""</property>
	</component>
	
	<component name="connectionPool"
		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
		<property name="XADataSource">xaDataSource</property>
		<property name="transactionManager">transactionManager</property>
		<property name="timeout">600</property>
		<property name="maxPoolSize">10</property>
		<destroyMethod name="close"/>
	</component>

	<component name="dataSource"
		class="org.seasar.extension.dbcp.impl.DataSourceImpl">
		<arg>connectionPool</arg>
	</component>
	
         <!-- DBサーバー その2 -->
	<component name="xaDataSource2"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">
			"org.hsqldb.jdbcDriver"
		</property>
		<property name="URL">
			"jdbc:hsqldb:hsql://192.168.0.4:9001"
		</property>
		<property name="user">"sa"</property>
		<property name="password">""</property>
	</component>

	<component name="connectionPool2"
		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
		<property name="XADataSource">xaDataSource2</property>
		<property name="transactionManager">transactionManager</property>
		<property name="timeout">600</property>
		<property name="maxPoolSize">10</property>
		<destroyMethod name="close"/>
	</component>
	
	<component name="dataSource2"
		class="org.seasar.extension.dbcp.impl.DataSourceImpl">
		<arg>connectionPool2</arg>
	</component>
	
</components>

dao.dicon

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components namespace="dao">
	<include path="j2ee.dicon"/>
         <!-- DBサーバー その1 -->
	<component name="dmdf"
		class="org.seasar.dao.impl.DaoMetaDataFactoryImpl">
		<arg>dataSource</arg>
		<arg>bsf</arg>
		<arg>brsf</arg>
	</component>
	<component name="interceptor"
		class="org.seasar.dao.interceptors.S2DaoInterceptor">
		<arg>dmdf</arg>
	</component>

         <!-- DBサーバー その2 -->
	<component name="dmdf2"
		class="org.seasar.dao.impl.DaoMetaDataFactoryImpl">
		<arg>dataSource2</arg>
		<arg>bsf</arg>
		<arg>brsf</arg>
	</component>
	<component name="interceptor2"
		class="org.seasar.dao.interceptors.S2DaoInterceptor">
		<arg>dmdf2</arg>
	</component>
</components>

これで、以下のように各Daoクラスを定義するdiconファイルで、2つのintercepterをDaoで利用したい接続先で使い分ければよし。
で、後はS2TxなりTransactionManagerを使うなりでトランザクション管理できました。

EmployeeAutoDao.dicon

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
	<include path="dao.dicon"/>
         <!-- DBサーバーその1に接続するDao -->
	<component class="examples.dao.DepartmentDao">
		<aspect>dao.interceptor</aspect>
	</component>
         <!-- DBサーバーその2に接続するDao -->
	<component class="examples.dao.EmployeeAutoDao">
		<aspect>dao.interceptor2</aspect>
	</component>
</components>

キーワード:Seasar2,S2JTA,S2DBCP,S2JDBC,S2DAO,複数DB