Forums: Open Discussion (Thread #21895)

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

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

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

Reply to #42287×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

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パッケージ配下の
クラスを拡張していただくことになるかと思います。

以上、よろしくお願いいたします。
Reply to #42287

Reply to #42496×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login