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>