[Seasar-user:11886] Re: [S2Dao]S2Daoで複数DBへの接続

林 祐一郎 [E-MAIL ADDRESS DELETED]
2007年 12月 3日 (月) 17:49:44 JST


JUNDU様

いつもお世話になっております。林祐一郎です。

教えていただいたとおり、各.diconファイルをメンテナンスいたしました。

結果。。。2つのDBへ接続することができるようになりました!

ありがとうございます。
これで、詰まっていた部分から抜け出すことができました。

資料を参考にするときは、もう少し、どのバージョンで使用可能なのか、
ということの切り分けを、きちっとしていくようにしてまいります。


そして、
本間様
せと様

こちらから提示する資料が少なく、大変ご迷惑をおかけしました。
チェックポイントをしっかりと設定して、今後の
開発に取り組んでいこうと思います。


以上です。
大変お世話になりました。

今後とも、よろしくお願いいたします。

それでは、失礼いたします。


-----Original Message-----
From: [E-MAIL ADDRESS DELETED]
[mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of JUNDU
Sent: Monday, December 03, 2007 3:18 PM
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:11882] Re: [S2Dao]S2Daoで複数DBへの接続

JUNDUです。

 いつもお世話になっております。Seasar2.3系をお使いということで、それを前提
に書きます。メーラーに直接書いているので、少し間違っているかもしれませんが、
イメージをつかんでいただければ。

 まず、実験するときは新しいプロジェクトを作って最小構成(2データベース、
各々1つずつのDao)で試すことをお勧めします。

 必要なファイルは、以下の通りです。

app.dicon … AutoRegisterを記述。Daoを含むコンポーネント定義。
j2ee.dicon … トランザクション制御コンポーネント類。
dao_db1.dicon … DB1用のS2Dao定義
j2ee_db1.dicon … DB1用のコネクションプール定義
dao_db2.dicon … DB2用のS2Dao定義
j2ee_db2.dicon … DB2用のコネクションプール定義

 それぞれのデータベースに接続するDaoは、パッケージを分けます。これは、
AutoRegisterが識別できるようにするためです。ここでは、package.dao.db1パッ
ケー
ジとpackage.dao.db2パッケージに分けたとしてサンプルを書きます。

<!-- app.dicon -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
	"http://www.seasar.org/dtd/components23.dtd">
<components>
	<include path="dao_db1.dicon"/>
	<include path="dao_db2.dicon"/>
	<!-- DB1用定義 -->
	<component

class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRe
gister">
		<initMethod name="addClassPattern">
			<arg>"package.dao.db1"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>
	<component
class="org.seasar.framework.container.autoregister.AspectAutoRegister">
		<property name="interceptor">dao_db1.interceptor</property>
		<!--                         ↑DB1用diconファイルに定義した
S2Daoインターセプタ -->
		<initMethod name="addClassPattern">
			<arg>"package.dao.db1"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>
	<!-- DB2用定義 -->
	<component

class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRe
gister">
		<initMethod name="addClassPattern">
			<arg>"package.dao.db2"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>
	<component
class="org.seasar.framework.container.autoregister.AspectAutoRegister">
		<property name="interceptor">dao_db2.interceptor</property>
		<!--                         ↑DB2用diconファイルに定義した
S2Daoインターセプタ -->
		<initMethod name="addClassPattern">
			<arg>"package.dao.db2"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>
	<!--
	  このあたりに業務系コンポーネントの定義など
	-->
</components>

<!-- dao_db1.dicon -->
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC
"-//SEASAR2.1//DTD S2Container//EN"
	"http://www.seasar.org/dtd/components21.dtd">
<components namespace="dao_db1">
	<!-- ↑namespaceにdb1を指定、↓j2ee.diconもDB1用に変更 -->
	<include path="j2ee_db1.dicon"/>
	<component
		class="org.seasar.dao.impl.FieldAnnotationReaderFactory"/>
	<component
		class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>
	<component name="interceptor"
		class="org.seasar.dao.interceptors.S2DaoInterceptor"/>
	<component
		class="org.seasar.dao.impl.ValueTypeFactoryImpl"/>
	<component
		name="stringClobType"
		class="org.seasar.extension.jdbc.types.StringClobType"/>
</components>

<!-- j2ee_db1.dicon -->
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC
"-//SEASAR2.1//DTD S2Container//EN"
	"http://www.seasar.org/dtd/components21.dtd">
<components namespace="j2ee_db1">
	<include path="j2ee.dicon"/>
	<!-- ↑j2ee.diconをインクルードする -->

	<!-- ↓接続先によって切り替えると思うのでコネクションプールと一緒に
定義 -->
	<component
class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
			<component
class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
	<!--
	<component
class="org.seasar.extension.jdbc.impl.OracleResultSetFactory"/>
	<component
class="org.seasar.extension.jdbc.impl.BooleanToIntStatementFactory"/>
	-->

	<!-- ↓コンポーネント定義をコネクションプール関連のみにする -->
	<component name="xaDataSource"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">
			"org.hsqldb.jdbcDriver"
		</property>
		<property name="URL">
			"jdbc:hsqldb:file:"
				+
@[E-MAIL ADDRESS DELETED](@org.seasar.dao.impl.Clo
[E-MAIL ADDRESS DELETED]).getCanonicalPath()
				+ "/data/demo"
		</property>
		<property name="user">"sa"</property>
		<property name="password">""</property>

<!--<initMethod>#out.println(@[E-MAIL ADDRESS DELETED]
ctRoot("s2dao").getAbsolutePath())</initMethod>-->
	</component>

	<component name="connectionPool"
		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
		<property name="timeout">600</property>
		<property name="maxPoolSize">10</property>
		<!-- JTAトランザクションが開始されていない場合にコネクション
を
		     取得できないようにするには次のプロパティをfalseにしてく
ださい.-->
		<property name="allowLocalTx">true</property>
		<destroyMethod name="close"/>
	</component>
	<component name="dataSource"
		class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
</components>

<!-- j2ee.dicon -->
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC
"-//SEASAR2.1//DTD S2Container//EN"
	"http://www.seasar.org/dtd/components21.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="notSupportedTx"
		class="org.seasar.extension.tx.NotSupportedInterceptor"/>
</components>

 dao_db2.diconとj2ee_db2.diconは、それぞれdb1用とデータベースのところが違う
だけなので省略しています。ポイントは、j2ee.diconを全体共通(トランザクション
管理)と個別(コネクションプール)に分けて、S2Daoの定義ファイルである
dao.diconとそれぞれ関連付けることです。

 そして、2つのdao.diconに定義したインターセプタを識別できるようにしておい
て(ここではnamespaceで識別)、AspectAutoRegisterでそれぞれのパッケージと関
連付ければ、DB1用のパッケージに作ったDaoはDB1に、DB2用のパッケージに作った
DaoはDB2に接続されるようになります。

 以上です。


----------
  JUNDU <[E-MAIL ADDRESS DELETED]>
_______________________________________________
Seasar-user mailing list
[E-MAIL ADDRESS DELETED]
https://ml.seasar.org/mailman/listinfo/seasar-user




Seasar-user メーリングリストの案内