フォーラム: 公開討議 (スレッド #21895)

【バッチFW】データソース複数定義について (2009-03-03 19:38 by 匿名 #42287)

お世話になります。
以前、データソースの複数使用に際しての各種ファイルの設定等アドバイスいただいた者です。
その際には参照・更新用と参照専用のデータベースを前提にしたご説明でしたが、
両データベースともに「参照・更新用」として使用したい場合に、具体的に設定が必要なファイルとその内容をお教え願えないでしょうか?
素のフレームワークでは分散トランザクションに対応していない為、フレームワークの拡張になるかとは思いますが・・・。

以上、よろしくお願いします。

メッセージ #42287 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

RE: 【バッチFW】データソース複数定義について (2009-03-11 16:57 by kuramotoki #42496)

分散トランザクションについてですが、当方にて簡単な検証を行い、動作することを確認しましたので
ご参考にしていただければと思います。
(正常系、ERROR_ENDや例外発生といったAP異常をいくつか試しました。)
# JTA実装はJOTM<http://jotm.objectweb.org/>を利用しています。

なお、動作を保証できるわけではないのでその点をご了承ください。

設定はdataAccessContext-batch.xmlに以下のように設定しました。
=== dataAccessContext-batch.xmlの設定例 ===
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">

<!-- プレースホルダ -->
<import resource="classpath:common/PlaceHolderConfig.xml" />

<!-- xapoolのXADataSource DB:Oracle-->
<bean id="xaDataSource" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager"><ref bean="jotm"/></property>
<property name="driverName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>

<!-- xapoolのXADataSource DB:PostgreSQL-->
<bean id="xaDataSource2" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager"><ref bean="jotm"/></property>
<property name="driverName" value="${jdbc.driverClassName2}" />
<property name="url" value="${jdbc.url2}" />
<property name="user" value="${jdbc.username2}" />
<property name="password" value="${jdbc.password2}" />
</bean>

<!-- JOTM(UserTransaction AND TransactionManager)Create FactoryBean -->
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean">
<property name="defaultTimeout" value="86400"/>
</bean>

<!-- xapoolのコネクションプーリング DB:Oracle -->
<bean id="dataSourceSample" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource"><ref local="xaDataSource"/></property>
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>

<!-- xapoolのコネクションプーリング DB:PostgreSQL -->
<bean id="dataSourceSample2" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource"><ref local="xaDataSource2"/></property>
<property name="user" value="${jdbc.username2}" />
<property name="password" value="${jdbc.password2}" />
</bean>

<!-- iBATIS データベース層のためのSQlMapの設定 DB:Oracle -->
<bean id="sqlMapClientSample" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSourceSample" />
<property name="configLocation" ref="sqlMapConfigFileName" />
</bean>

<!-- iBATIS データベース層のためのSQlMapの設定 DB:PostgreSQL -->
<bean id="sqlMapClientSample2" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSourceSample2" />
<property name="configLocation" ref="sqlMapConfigFileName" />
</bean>

<!-- SpringのTransactionManager -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction"><ref local="jotm"/></property>
<property name="defaultTimeout" value="86400"/>
</bean>

<!-- ===================== DAO定義: IBATIS実装 DB:Oracle ===================== -->
<!-- 照会系のDAO -->
<bean id="xqueryDAO" class="jp.terasoluna.fw.dao.ibatis.QueryDAOiBatisImpl">
<property name="sqlMapClient" ref="sqlMapClientSample" />
</bean>

<!-- 更新系のDAO -->
<bean id="xupdateDAO" class="jp.terasoluna.fw.dao.ibatis.UpdateDAOiBatisImpl">
<property name="sqlMapClient" ref="sqlMapClientSample" />
</bean>

<!-- ストアドプロシジャ用のDAO -->
<bean id="xspDAO" class="jp.terasoluna.fw.dao.ibatis.StoredProcedureDAOiBatisImpl">
<property name="sqlMapClient" ref="sqlMapClientSample" />
</bean>

<!-- ===================== DAO定義: IBATIS実装 DB:PostgreSQL ===================== -->
<!-- 照会系のDAO -->
<bean id="queryDAO" class="jp.terasoluna.fw.dao.ibatis.QueryDAOiBatisImpl">
<property name="sqlMapClient" ref="sqlMapClientSample2" />
</bean>

<!-- 更新系のDAO -->
<bean id="updateDAO" class="jp.terasoluna.fw.dao.ibatis.UpdateDAOiBatisImpl">
<property name="sqlMapClient" ref="sqlMapClientSample2" />
</bean>

<!-- ストアドプロシジャ用のDAO -->
<bean id="xspDAO2" class="jp.terasoluna.fw.dao.ibatis.StoredProcedureDAOiBatisImpl">
<property name="sqlMapClient" ref="sqlMapClientSample2" />
</bean>


</beans>
===

上記の設定を行ったうえで、それぞれのDAOをビジネスロジックにDIして参照/更新を行います。

業務要件を考慮したうえで、利用しているの環境にて検証をお願いします。
また、DB異常が発生した場合は確認を行っていないので、環境面の異常発生時の検証をする必要はあると思います。

仮にFWに手を加える必要が生じた際には、jp.terasoluna.fw.batch.springsupport.transactionパッケージ配下の
クラスを拡張していただくことになるかと思います。

以上、よろしくお願いいたします。
#42287 への返信

メッセージ #42496 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする