[Seasar-user:4064] Re: Daoにそれぞれのデータソースを割り当てたい【解決】

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2006年 7月 13日 (木) 12:41:23 JST


関です。

JUNDUさん、ありがとうございます。

JUNDUさんの言うように FileSystemComponentAutoRegister の設定を追加する事で
期待する動作が行われました。これでまた一歩前進(^^

コンポーネントに InterceptorChain を追加した際に
addClassPattern で設定を投入する事で、実際のファイルにも
反映されているものと勘違いしていたことが原因でした。

以下に(パッケージ内の)クラス毎にデータソースを使い分ける方法を
まとめておきます。ただ、不幸にもS2 2.4からはdicon構成が
変わってしまうので使えないかも?

** 参考 ******************************************

1. j2ee の 作成
 j2ee.dicon を3個に分ける

1-1. j2ee.dicon
 以下の3個の設定を削除、共通部分を作成する
 org.seasar.extension.dbcp.impl.XADataSourceImpl
 org.seasar.extension.dbcp.impl.ConnectionPoolImpl
 org.seasar.extension.dbcp.impl.DataSourceImpl

1-2. j2ee_hssql.dicon
1-3. j2ee_mysql.dicon
 以下の3個の設定を記述、DataSourceを作成する
 org.seasar.extension.dbcp.impl.XADataSourceImpl
 org.seasar.extension.dbcp.impl.ConnectionPoolImpl
 org.seasar.extension.dbcp.impl.DataSourceImpl

2. j2ee と Interceptor のマッピング
 dao.dicon をコピーして2個作成する

2-1. dao_hssql.dicon
2-2. dao_mysql.dicon
 それぞれが使用するDataSourceを含んだj2ee〜〜をインクルードし、
 Interceptorを用意する。

3. Interceptor と InterceptorChain のマッピング
 allaop.dicon を修正し daoInterceptorChain を2個にする

3-1. allaop.dicon
 dao〜〜.dicon で作成したInterceptorを含む
 InterceptorChain を2個作成する。

4.  InterceptorChain とコンポーネントのマッピング と コンポーネントと クラスのマッピング

4-1. app.dicon
	AspectAutoRegister で InterceptorChain をコンポーネントに適応
	FileSystemComponentAutoRegister で実際のパッケージのクラスをコンポーネント化する

この流れで、クラスファイル毎にj2eeのDataSourceを適応する事が出来ました。

******************************************************

= 1-1. j2ee.dicon ============================================================
<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 class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
	<component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>

</components>

= 1-2. j2ee_hssql.dicon ============================================================

<components namespace="j2ee_hssql">

	<include path="j2ee.dicon"/>

	<!-- MSSQL -->
	<component name="xaDataSourceHsSql"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">
			"org.hsqldb.jdbcDriver"
		</property>
		<property name="URL">
			"jdbc:hsqldb:hsql://localhost:9001"
		</property>
		<property name="user">"user"</property>
		<property name="password">"pass"</property>
	</component>

	<component name="connectionPoolHsSql"
		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
		<property name="timeout">600</property>
		<property name="maxPoolSize">10</property>
		<property name="allowLocalTx">true</property>
		<property name="XADataSource">xaDataSourceHsSql</property>
		<destroyMethod name="close"/>
	</component>

	<component name="dataSourceHsSql"
		class="org.seasar.extension.dbcp.impl.DataSourceImpl">
		<arg>connectionPoolHsSql</arg>
	</component>

</components>

= 1-3. j2ee_mysql.dicon ============================================================

<components namespace="j2ee_mysql">

	<include path="j2ee.dicon"/>

	<!-- MYSQL -->
	<component name="xaDataSourceMySql"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">
			"com.mysql.jdbc.Driver"
		</property>
		<property name="URL">
			"jdbc:mysql://localhost/database"
		</property>
		<property name="user">"user"</property>
		<property name="password">"pass"</property>
	</component>

	<component name="connectionPoolMySql"
		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
	    <property name="timeout">600</property>
	    <property name="maxPoolSize">10</property>
		<property name="allowLocalTx">true</property>
	    <property name="XADataSource">xaDataSourceMySql</property>
	    <destroyMethod name="close"/>
	</component>

	<component
		name="dataSourceMySql"
		class="org.seasar.extension.dbcp.impl.DataSourceImpl">
		<arg>connectionPoolMySql</arg>
	</component>


</components>

= 2-1. dao_hssql.dicon ============================================================

<components namespace="dao_hssql">

	<include path="j2ee_hssql.dicon"/>	<!-- HSSQL -->
	<include path="j2ee.dicon"/>

	<component
		class="org.seasar.dao.impl.FieldAnnotationReaderFactory"/>
	<component
		class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>
	<component name="interceptor"
		class="org.seasar.dao.interceptors.S2DaoInterceptor"/>

</components>

= 2-2. dao_mysql.dicon ============================================================

<components namespace="dao_mysql">

	<include path="j2ee_mysql.dicon"/>	<!-- MYSQL -->
	<include path="j2ee.dicon"/>

	<component
		class="org.seasar.dao.impl.FieldAnnotationReaderFactory"/>
	<component
		class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>
	<component name="interceptor"
		class="org.seasar.dao.interceptors.S2DaoInterceptor"/>

</components>

= 3-1. allaop.dicon ============================================================
<components>
	<include path="aop.dicon"/>

	<include path="dao_hssql.dicon"/> <!-- HSSQL -->
	<include path="dao_mysql.dicon"/> <!-- MYSQL -->

	<include path="j2ee.dicon"/>

	<component
		name="actionThrowsInterceptor"
		class="examples.jsf.interceptor.ActionThrowsInterceptor"
	/>

	<component
		name="actionInterceptorChain"
		class="org.seasar.framework.aop.interceptors.InterceptorChain"
	>
		<initMethod name="add"><arg>aop.traceInterceptor</arg></initMethod>
		<initMethod name="add"><arg>actionThrowsInterceptor</arg></initMethod>
	</component>

	<component
		name="logicInterceptorChain"
		class="org.seasar.framework.aop.interceptors.InterceptorChain"
	>
		<initMethod name="add"><arg>aop.traceThrowsInterceptor</arg></initMethod>
		<initMethod name="add"><arg>aop.traceInterceptor</arg></initMethod>
		<initMethod name="add"><arg>j2ee.requiredTx</arg></initMethod>
	</component>

	<!-- HSSQL -->
	<component
		name="daoInterceptorChainHsSql"
		class="org.seasar.framework.aop.interceptors.InterceptorChain"
	>
		<initMethod name="add"><arg>aop.traceInterceptor</arg></initMethod>
		<initMethod name="add"><arg>dao_hssql.interceptor</arg></initMethod>
	</component>

	<!-- MYSQL -->
	<component
		name="daoInterceptorChainMySql"
		class="org.seasar.framework.aop.interceptors.InterceptorChain"
	>
		<initMethod name="add"><arg>aop.traceInterceptor</arg></initMethod>
		<initMethod name="add"><arg>dao_mysql.interceptor</arg></initMethod>
	</component>

</components>

= 4-1. app.dicon ============================================================
<components>
	<include path="jsf.dicon"/>

	<include path="dao_hssql.dicon"/>
	<include path="dao_mysql.dicon"/>

	<include path="examples/jsf/dicon/allaop.dicon"/>
	<include path="examples/jsf/dicon/allconverter.dicon"/>
	<include path="examples/jsf/dicon/allvalidator.dicon"/>
	<include path="examples/jsf/dicon/foreach.dicon"/>
	<include path="examples/jsf/dicon/selectmanycheckbox.dicon"/>
	<include path="examples/jsf/dicon/selectmanylistbox.dicon"/>
	<include path="examples/jsf/dicon/selectonemenu.dicon"/>
	<include path="examples/jsf/dicon/selectoneradio.dicon"/>

	<component
		class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"
	>
		<property name="instanceDef">
			@[E-MAIL ADDRESS DELETED]
		</property>
		<initMethod name="addClassPattern">
			<arg>"examples.jsf.action.impl"</arg>
			<arg>".*ActionImpl"</arg>
		</initMethod>
	</component>

	<component
		class="org.seasar.framework.container.autoregister.AspectAutoRegister"
	>
		<property name="interceptor">actionInterceptorChain</property>
		<initMethod name="addClassPattern">
			<arg>"examples.jsf.action.impl"</arg>
			<arg>".*ActionImpl"</arg>
		</initMethod>
	</component>

	<component
		class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"
	>
		<property name="instanceDef">
			@[E-MAIL ADDRESS DELETED]
		</property>
		<initMethod name="addClassPattern">
			<arg>"examples.jsf.dto"</arg>
			<arg>".*Dto"</arg>
		</initMethod>
	</component>

	<component
		class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"
	>
		<initMethod name="addClassPattern">
			<arg>"examples.jsf.logic.impl"</arg>
			<arg>".*LogicImpl"</arg>
		</initMethod>
	</component>

	<component
		class="org.seasar.framework.container.autoregister.AspectAutoRegister"
	>
		<property name="interceptor">logicInterceptorChain</property>
		<initMethod name="addClassPattern">
			<arg>"examples.jsf.logic.impl"</arg>
			<arg>".*LogicImpl"</arg>
		</initMethod>
	</component>

	<!--	HSSQL	-->
	<component
		class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"
	>
		<initMethod name="addClassPattern">
			<arg>"examples.jsf.daohssql"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>

	<!--	MYSQL	-->
	<component
		class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"
	>
		<initMethod name="addClassPattern">
			<arg>"examples.jsf.daomysql"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>

	<!--	HSSQL	-->
	<component
		class="org.seasar.framework.container.autoregister.AspectAutoRegister"
	>
		<property name="interceptor">daoInterceptorChainHsSql</property>
		<initMethod name="addClassPattern">
			<arg>"examples.jsf.daohssql"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>

	<!--	MYSQL	-->
	<component
		class="org.seasar.framework.container.autoregister.AspectAutoRegister"
	>
		<property name="interceptor">daoInterceptorChainMySql</property>
		<initMethod name="addClassPattern">
			<arg>"examples.jsf.daomysql"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>

</components>

** 参考 ココマデ ******************************************





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