[Seasar-user:11882] Re: [S2Dao]S2Daoで複数DBへの接続
JUNDU
[E-MAIL ADDRESS DELETED]
2007年 12月 3日 (月) 15:17:30 JST
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.FileSystemComponentAutoRegister">
<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.FileSystemComponentAutoRegister">
<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](@[E-MAIL ADDRESS DELETED]).getCanonicalPath()
+ "/data/demo"
</property>
<property name="user">"sa"</property>
<property name="password">""</property>
<!--<initMethod>#out.println(@[E-MAIL ADDRESS DELETED]("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 メーリングリストの案内