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

バッチFW 複数DB接続設定の方法 (2009-02-10 16:26 by 匿名 #41768)

「【バッチFW】複数のデータベースの参照について」
に便乗しても質問です。
回答の中で、
「データソースを(Oracle用、PostgreSQL用に)2つ定義し・・・」とございますが、どのファイルの設定になるのでしょうか?
また、2つの定義のサンプルなどご提示いただけますと大変参考になります。
また、バッチFWではSQLServerへの接続は可能でしょうか?

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

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

RE: バッチFW 複数DB接続設定の方法 (2009-02-10 16:54 by kuramotoki #41769)

順番が前後して申し訳ございませんが、SQLServerについて先に回答します。
SQLServerは、当方で試験をしておりませんが、実際に利用した例はあるようです。
本フォーラムの
スレッド名:【バッチFW】非同期ジョブ起動でジョブ管理テーブルの競合発生
をご覧下さい。
<http://sourceforge.jp/forum/forum.php?thread_id=21389&forum_id=13381>
ロックの方法の違いでトラブルが発生したようですので、検証をおねがいします。

次に、データーソースの複数定義についてですが、以下の2ファイルになります。
・dataAccessContext-batch.xml
・jdbc.properties
定義後は通常通りBLogicなどでDIして利用します。

定義内容のサンプルについてですが、関係ない部分を省き、以下に記述します。
ご参考まで。
---dataAccessContext-batch.xml---
<!-- PostgreSQLデータソース(参照・更新用) -->
<bean id="postgreDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="poolPreparedStatements" value="true" />
<property name="defaultAutoCommit" value="false" />
<!-- property name="maxActive" ref="threadSize"/ -->
</bean>

<!-- Oracleデータソース(参照専用) -->
<bean id="oracleDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName2}" />
<property name="url" value="${jdbc.url2}" />
<property name="username" value="${jdbc.username2}" />
<property name="password" value="${jdbc.password2}" />
<property name="poolPreparedStatements" value="true" />
<property name="defaultAutoCommit" value="false" />
<!-- property name="maxActive" ref="threadSize"/ -->
</bean>

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

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

<!-- 単一のJDBCデータソース向けのトランザクションマネージャ(PostgresqlのデータソースのみtransactionManagerに入れる) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="postgreDataSource" />
</bean>

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

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

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

<!-- ===================== Oracle DAO定義: IBATIS実装 ===================== -->
<!-- 照会系のDAO -->
<bean id="queryDAO2" class="jp.terasoluna.fw.dao.ibatis.QueryDAOiBatisImpl">
<property name="sqlMapClient" ref="oracleSqlMapClient" />
</bean>
<!-- 更新系のDAOは提供しない -->
<!-- ストアドプロシジャ用のDAOは提供しない -->
---

---jdbc.properties---
# local PostgreSQL
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://127.0.0.1:5432/test
jdbc.username=test
jdbc.password=test

# local Oracle Express Edition
jdbc.driverClassName2=oracle.jdbc.driver.OracleDriver
jdbc.url2=jdbc:oracle:thin:@127.0.0.1:1521:test
jdbc.username2=test
jdbc.password2=test
---

以上、長文となってしまい申し訳ありません。よろしくお願いします。
#41768 への返信

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

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

RE: バッチFW 複数DB接続設定の方法 (2010-08-26 19:07 by ちょちょぽりす #52631)

<!-- 更新系のDAOは提供しない -->
となっていますが、更新系のDAOは更新できないということでしょうか?
#41769 への返信

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

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

RE: バッチFW 複数DB接続設定の方法 (2009-02-10 17:12 by 匿名 #41770)

kuramotokiさま

早速のご回答ありがとうございます。
ご提示いただいた内容で検証をおこなってみたいと思います。
ありがとうございました。

#41768 への返信

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

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

RE: バッチFW 複数DB接続設定の方法 (2009-02-10 18:36 by 匿名 #41774)

kuramotokiさま

再度ご質問させてください。
上記サンプルを元に該当ファイルの書き換えをおこなったのですが、「定義後は通常通りBLogicなどでDIして利用します。」というところでつまづいてしまいました。
①対象データ取得処理(コレクタ)で上記Oracleデータベースを使用する場合、
②ビジネスロジックで上記Oracleデータベースを使用する場合、
以上2パターンでの扱うべきファイル、簡単な記述例などご提示いただけますと助かります。

初歩的な質問で誠に申し訳ないのですが何卒よろしくお願いします。
#41768 への返信

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

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

RE: バッチFW 複数DB接続設定の方法 (2009-02-10 19:48 by kuramotoki #41776)

コレクタで利用する場合、ビジネスロジックで利用する場合の2パターンについて、
関係するファイルは
・ジョブBean定義ファイル
・ビジネスロジッククラス(前処理、後処理で利用する場合はそちらも必要です)
の2種類です。

作成例を以下に記述しますのでご参考にしてください。
# データソースの設定等は省いております。

===ビジネスロジック===
--ジョブBean定義ファイルの記述--
<!--ビジネスロジック-->
<bean id="blogic" class="jp.co.nttdata.sample2.JB0001BLogic">
<!-- PostgreSQLのDAO-->
<property name="queryDAO" ref="queryDAO" />
<property name="updateDAO" ref="updateDAO" />
<!-- OracleのDAO-->
<property name="queryDAO2" ref="queryDAO2" />
</bean>
--
--ビジネスロジッククラス--
public class JB0001BLogic implements BLogic<String, JobContext> {

// PostgreSQLのqueryDAO
private QueryDAO queryDAO = null;

// PostgreSQLのupdateDAO
private UpdateDAO updateDAO = null;

// OracleのqueryDAO2
private QueryDAO queryDAO2 = null;

// ビジネスロジック
public BLogicResult execute(String data, JobContext jobContext) {
JB0001Data insertData = new JB0001Data();
insertData.setUserid(data);

// PostgreSQLのQueryDAO 記述例
int updateCount = updateDAO.execute("JB0001_UPDATE_ID1", insertData);
System.out.println("updateDAO=" + updateCount);
// PostgreSQLのUpdateDAO 記述例
JB0001Data queryResult = queryDAO.executeForObject("JB0001_SQL_ID1",
insertData, JB0001Data.class);
System.out.println("queryDAO=" + queryResult.getUserid() +
queryResult.getUsername() + queryResult.getAge());

// OracleのQueryDAO 記述例
queryResult = queryDAO2.executeForObject("JB0001_SQL_ID2",
null, JB0001Data.class);
System.out.println("queryDAO2=" + queryResult.getUserid() +
queryResult.getUsername() + queryResult.getAge());

// ここまででPostgreSQLにのみトランザクションがかかっているので
// 例外発生すれば、PostgreSQLはロールバックされる。

return new BLogicResult(ReturnCode.NORMAL_CONTINUE);
}

// PostgreSQLのqueryDAOをセットする
public void setQueryDAO(QueryDAO queryDAO) {
this.queryDAO = queryDAO;
}

// PostgreSQLのupdateDAOをセットする
public void setUpdateDAO(UpdateDAO updateDAO) {
this.updateDAO = updateDAO;
}

// OracleのqueryDAO2をセットする
public void setQueryDAO2(QueryDAO queryDAO2) {
this.queryDAO2 = queryDAO2;
}
}
--
===

===コレクタ===
--ジョブBean定義ファイルの記述--
<!--コレクタ定義-->
<bean id="collector" parent="IBatisDbChunkCollector">
<!-- OracleのDAOを使うため、参照DAOを明示的に上書きする。 -->
<property name="queryDAO" ref="queryDAO2" />
<property name="sql" value="UC0001.getNyukinData"/>
</bean>
--
===

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

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

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

RE: バッチFW 複数DB接続設定の方法 (2009-02-10 20:55 by 匿名 #41777)

kuramotokiさま

サンプルご提示、誠にありがとうございました。
早速検証してみたいと思います。
ちなみに、上記の例ではPostgreSQLとOracleでの複数データベースの使用ですが、例えばPostgreSQLの異なるデータベースを複数使用するような場合でも、上記サンプルの方法に則って設定・記述をおこなえば良いのでしょうか?それとも違う設定方法となるのでしょうか?
度重なる質問で誠に恐縮なのですがどうぞよろしくお願いします。

#41768 への返信

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

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

RE: バッチFW 複数DB接続設定の方法 (2009-02-12 13:59 by kuramotoki #41820)

PostgreSQL複数の場合も、同様の設定で問題ないです。
また、PostgreSQL複数を扱う場合、
contribで提供されているdblinkを使うことも可能かと考えますが、
dblinkを使ったクエリは通常のSQLと書き方が異なることと、
トランザクションが効かない(常にAutoCommitされる)
ようですので、制御が複雑になるかと思います。

以上です。
#41777 への返信

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

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

RE: バッチFW 複数DB接続設定の方法 (2009-02-11 10:01 by 匿名 #41790)

kuramotokiさま

複数データベース接続、サンプルを元に動作確認できました。
とても助かりました。
ありがとうございました。

#41768 への返信

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

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