[Seasar-user:19414] Re: dataSourceNameはnullあるいは空であってはいけません

吉村 実 [E-MAIL ADDRESS DELETED]
2010年 2月 28日 (日) 15:31:41 JST


小林様

ちなみにですが、修正個所の量によっては
SelectableDataSourceを使わない方法も選択肢の一つとして
考えなければならないのですが、
[Seasar-user:19397]のご回答にありましたが、

> SelectableDataSource を使う代わりに異なる
> Dao のインスタンスを使い分けているからですね.

これまで(バージョンアップ前)通り、上記のように
Daoのインスタンスを使い分けて切り替えようとしたときに、
片方のデータソース(下記jdbc.diconのxaDataSource)にしか
アクセスしなくなってしまったのは
なぜなのでしょうか。
プログラムにおいてxaDataSourceForOp側にアクセスしようと
してエラーになるとかではなく、もれなくxaDataSourceの方に
行ってしまいます。(if文においてはきちんと条件分岐されてるのですが)

なんだか、前に戻ってしまって
心苦しいのですが、どうもSelectableDataSourceにした場合、
修正個所がかなり多くなってしまいそうでして。。


「ご教授いただく前のallaop.dicon」
<components namespace="allaop">

	<include path="aop.dicon"/>
	<include path="aop_hoge.dicon"/>
	<include path="j2ee.dicon"/>
	<include path="dao_hoge.dicon"/>

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

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

	<component name="daoInterceptorChain"
class="org.seasar.framework.aop.interceptors.InterceptorChain">
		<initMethod
name="add"><arg>aop_hoge.traceInterceptor</arg></initMethod>
		<initMethod
name="add"><arg>dao_hoge.interceptor</arg></initMethod>
	</component>

	<component name="daoInterceptorChainForOp"
class="org.seasar.framework.aop.interceptors.InterceptorChain">
		<initMethod
name="add"><arg>aop_hoge.traceInterceptor</arg></initMethod>
		<initMethod
name="add"><arg>dao_hoge.interceptorForOp</arg></initMethod>
	</component>

</components>


「ご教授いただく前のcodao.dicon」
<components>

	<include path="allaop.dicon"/>

    <!-- auto registration -->
	<component
class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRe
gister">
		<property name="autoNaming">
			<component
class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
		</property>
		<initMethod name="addClassPattern">
			<arg>"jp.go.hoge.common.dao"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>
	<component
class="org.seasar.framework.container.autoregister.AspectAutoRegister">
		<property
name="interceptor">allaop.daoInterceptorChain</property>
		<initMethod name="addClassPattern">
			<arg>"jp.go.hoge.common.dao"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>
</components>


「ご教授いただく前のopdao.dicon」
<components>

    <include path="allaop.dicon"/>

    <!-- auto registration -->
	<component
class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRe
gister">
		<property name="autoNaming">
			<component
class="org.seasar.framework.container.autoregister.DefaultAutoNaming">
				<initMethod name="addReplaceRule">
					<arg>"$"</arg>
					<arg>"ForOp"</arg>
				</initMethod>
			</component>
		</property>
		<initMethod name="addClassPattern">
			<arg>"jp.go.hoge.common.dao"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>
	<component
class="org.seasar.framework.container.autoregister.AspectAutoRegister">
		<property
name="interceptor">allaop.daoInterceptorChainForOp</property>
		<initMethod name="addClassPattern">
			<arg>"jp.go.hoge.common.dao"</arg>
			<arg>".*Dao"</arg>
		</initMethod>
	</component>
</components>


「ご教授いただく前のdao_hoge.dicon」
<components namespace="dao_hoge">
	<include path="jdbc.dicon"/>

	<component
		name="annotationReaderFactory"

class="org.seasar.dao.annotation.tiger.impl.AnnotationReaderFactoryImpl"/>

	<component
		class="org.seasar.dao.impl.ValueTypeFactoryImpl"/>
	<component
		name="stringClobType"
		class="jp.go.hoge.common.jdbc.types.StringClobType"/>
	<component
		name="resultSetFactory"
		class="org.seasar.dao.pager.PagerResultSetFactoryWrapper">
		<arg>
			<component
class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
		</arg>
		<property name="useScrollCursor">true</property>
	</component>

	<component class="org.seasar.dao.impl.BeanMetaDataFactoryImpl"/>
	<component class="org.seasar.dao.impl.DaoNamingConventionImpl"/>
	<component class="org.seasar.dao.impl.NullBeanEnhancer"/>
	<component
class="org.seasar.dao.impl.ResultSetHandlerFactorySelector"/>
	<component class="org.seasar.dao.impl.DtoMetaDataFactoryImpl"/>
	<component
class="org.seasar.dao.impl.PropertyTypeFactoryBuilderImpl"/>
	<component
class="org.seasar.dao.impl.RelationPropertyTypeFactoryBuilderImpl"/>
	<component class="org.seasar.dao.impl.DefaultTableNaming"/>
	<component class="org.seasar.dao.impl.DefaultColumnNaming"/>
	<component
class="org.seasar.dao.impl.ProcedureMetaDataFactoryImpl"/>

	<component
		name="daoMetaDataFactory"
		class="org.seasar.dao.impl.DaoMetaDataFactoryImpl">
		<arg>jdbc.dataSource</arg>
		<arg>
			<component
class="org.seasar.dao.pager.PagerStatementFactory"/>
		</arg>
		<arg>resultSetFactory</arg>
		<arg>annotationReaderFactory</arg>
		<property
name="statementFactory">statementFactory</property>
 	</component>
	<component name="interceptor"
		class="org.seasar.dao.pager.PagerS2DaoInterceptorWrapper">
		<arg>
			<component name="s2dao"

class="org.seasar.dao.interceptors.S2DaoInterceptor">
				<arg>daoMetaDataFactory</arg>
			</component>
		</arg>
	</component>

	<component
		name="daoMetaDataFactoryForOp"
		class="org.seasar.dao.impl.DaoMetaDataFactoryImpl">
		<arg>jdbc.dataSourceForOp</arg>
		<arg>
			<component
class="org.seasar.dao.pager.PagerStatementFactory"/>
		</arg>
		<arg>resultSetFactory</arg>
		<arg>annotationReaderFactory</arg>
		<property
name="statementFactory">statementFactoryForOp</property>
	</component>

	<component name="interceptorForOp"
		class="org.seasar.dao.pager.PagerS2DaoInterceptorWrapper">
		<arg>
			<component name="s2dao"

class="org.seasar.dao.interceptors.S2DaoInterceptor">
				<arg>daoMetaDataFactoryForOp</arg>
			</component>
		</arg>
	</component>

</components>


「ご教授頂く前のjdbc.dicon」
<components namespace="jdbc">

	<include path="jta.dicon"/>
	<include path="jdbc-extension.dicon"/>

	<component
class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>

	<component name="xaDataSource"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">
			"oracle.jdbc.OracleDriver"
		</property>
		<property name="URL">
			"jdbc:oracle:oci:@db"
		</property>
		<property name="user">"COUSER"</property>
		<property name="password">"COPASSWORD"</property>
	</component>

	<component name="statementFactory"

class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>

	<component name="xaDataSourceForOp"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">
			"oracle.jdbc.OracleDriver"
		</property>
		<property name="URL">
			"jdbc:oracle:oci:@db"
		</property>
		<property name="user">"OPUSER"</property>
		<property name="password">"OPPASSWORD"</property>
	</component>

	<component name="statementFactoryForOp"

class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>

	<component name="connectionPool"
		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
		<property name="timeout">600</property>
		<property name="maxPoolSize">10</property>
		<property name="XADataSource">xaDataSource</property>
		<property name="allowLocalTx">false</property>
		<destroyMethod name="close"/>
	</component>
	<component name="dataSource"
		class="org.seasar.extension.dbcp.impl.DataSourceImpl">
		<arg>connectionPool</arg>
	</component>

	<component name="connectionPoolForOp"
		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
		<property name="timeout">600</property>
		<property name="maxPoolSize">10</property>
		<property name="XADataSource">xaDataSourceForOp</property>
		<property name="allowLocalTx">false</property>
		<destroyMethod name="close"/>
	</component>
	<component name="dataSourceForOp"
		class="org.seasar.extension.dbcp.impl.DataSourceImpl">
		<arg>connectionPoolForOp</arg>
	</component>

</components>


プログラム
if ( referDB.isOpDB() == true ) {
	prListForm.setTPrDataDao( tPrDataDaoForOp );

} else {
	prListForm.setTPrDataDao( tProcDataDao );

}

// 検索実行
return prListForm.getTPrDataDao().findBySearchCondition4PrList(
prSearchForm.getSaveSearchCondition() );


以上、
恐れ入りますが、宜しくお願い致します。




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