[Seasar-user:11883] Re: [S2Dao]S2Daoで複数DBへの接続
林 祐一郎
[E-MAIL ADDRESS DELETED]
2007年 12月 3日 (月) 16:24:41 JST
JUNDU様
お世話になっております。
林祐一郎です。
設定方法を教えていただき、
ありがとうございます。
まず、イメージをつかんで、じっくりと
取り組んでみます。
結果は、状況が進み次第、報告させていただきます。
それでは、失礼いたします。
-----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 メーリングリストの案内