[Seasar-user:19442] Re: dataSourceNameはnullあるいは空であってはいけません
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2010年 3月 3日 (水) 19:00:00 JST
小林 (koichik) です.
Date: Wed, 3 Mar 2010 09:41:54 +0900
From: 吉村 実 <[E-MAIL ADDRESS DELETED]>
To: <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:19436] Re: dataSourceNameはnullあるいは空であってはいけません
> dataSourceはプログラムの条件分岐に関わらず、
> 片方(COUSERの方)しか参照しておりませんでした。
>
> 「起動時ログ」
>
> dataSource : [E-MAIL ADDRESS DELETED]
> dataSourceForOp : [E-MAIL ADDRESS DELETED]
>
> 「デバッグ時」
>
> > > ■referDB.isOpDB() == false
> (datasourceがCOUSERにいくべき)
>
> [E-MAIL ADDRESS DELETED]
>
> > > ■referDB.isOpDB() == true
> (datasourceがOPUSERにいくべき)
>
> [E-MAIL ADDRESS DELETED]
ようやく原因がわかりました.
DaoMetaDataFactoryImpl は dataSource の
プロパティもあったのですね.
そして自動バインディングが有効なので,
<component
name="daoMetaDataFactoryForOp"
class="org.seasar.dao.impl.DaoMetaDataFactoryImpl">
<arg>jdbc.dataSourceForOp</arg>
<arg>
<component class="org.seasar.dao.pager.PagerStatementFactory"/>
</arg>
...
と書いたのは,実は
<component
name="daoMetaDataFactoryForOp"
class="org.seasar.dao.impl.DaoMetaDataFactoryImpl">
<arg>jdbc.dataSourceForOp</arg>
<arg>
<component class="org.seasar.dao.pager.PagerStatementFactory"/>
</arg>
<property name="dataSource">dataSource</property>
...
と書いたのと同じで,せっかくコンストラクタに
dataSourceForOp を渡していても,その後に
dataSource が設定されてしまっていたために,
dataSourceForOp にアクセスされなかったのだと
思われます.
これは,Seasar2.4 から名前 (と型) が一致
しているコンポーネントが一つだけあれば
自動バインディングが有効になるという
変更も影響しています.
コンストラクタインジェクションが使われて
いることに注意していれば,もっと早く気づく
ことができたはずですが,油断してました.
ひとまず,コンストラクタインジェクションを
使うのをやめて (<arg> 要素を削除して),
<component
name="daoMetaDataFactoryForOp"
class="org.seasar.dao.impl.DaoMetaDataFactoryImpl">
<property name="dataSource">jdbc.dataSourceForOp</property>
<property name="statementFactory">
<component class="org.seasar.dao.pager.PagerStatementFactory"/>
</property>
...
のようにすれば問題は解決すると思います.
しかし,こういった影響を少なくするために,
dao_tt.dicon もそれぞれの DataSource ごとに
dicon を分けることを推奨します.
# すでにやっておられるように jdbc.dicon も
# 分割したものを使ってください.
その際,DaoMetaDataFactory を定義している
dicon では,それぞれが必要とする方の
DataSource を定義した dicon だけをインクルード
することで,dataSource を明示的に指定する必要が
なくなります (自動バインディングに任せられる).
--
<component name="koichik">
<property name="fullName">"Koichi Kobayashi"</property>
<property name="email">"[E-MAIL ADDRESS DELETED]"</property>
<property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>
Seasar-user メーリングリストの案内