[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 メーリングリストの案内