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

Jundo Ishikawa [E-MAIL ADDRESS DELETED]
2006年 7月 12日 (水) 01:22:31 JST


JUNDUです。

 少し的をはずしてしまうかもしれませんが。

06/07/11 に [E-MAIL ADDRESS DELETED]<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 試したことは s2jsf-example の j2ee.diconを3分割し
> 1.j2ee.dicon (dataSource、xaDataSource、connectionPool をコメント)
> 2.j2ee-hssql.dicon (dataSource、xaDataSource、connectionPool を記述)
> 3.j2ee-mysql.dicon (dataSource、xaDataSource、connectionPool を記述)
> に分割しました。

 ここまでは、問題ないと思います。

> これで、hssqlとmysqlのDataSourceをコンポーネント化には成功している?つもりで
> LogicImpl で
> setDataSource(DataSource dataSource)
> setDataSourceMySql(DataSource dataSourceMySql)
> を記述しておくことでDataSourceのオブジェクトは作成されています。

 これは必要ないですね。プログラム側でDataSourceを取る必要はないです。
必要としているDaoにSeasar2から直接渡す形になるです。

 DataSourceは、dao.intercepter側にDIしてやる必要があると思います。
(正確にはDaoMetaDataFactoryImpl)

 具体的には、dao.diconを編集することになります。j2ee.diconをinclude
しているところの前に、作ったj2ee.diconファイルもincludeするように追記
します。

<components namespace="dao">
  <include path="j2ee-hssql.dicon"/>
  <include path="j2ee.dicon"/>
  <!-- 以下省略 -->

 これで、j2ee-hssql.diconを使うdao.intercepterができました。同じように
dao.diconをコピーして、j2ee-mysql.diconをincludeしたファイルも作ります。
つまり、dao.diconも2つ作るわけです。

 あとは、Daoで使いたいほうのdao.diconをincludeすることで切り替えられます。

 ひとつのdiconファイルから両方のデータベースへのDaoを定義する場合は、
片方のdao.diconのnamespaceかコンポーネント名を書き換えるとよいでしょう。

 例えば、以下のような感じにすればできると思います。

<components namespace="dao_hssql">
  <include path="j2ee-hssql.dicon"/>
  <include path="j2ee.dicon"/>
  <!-- 以下省略 -->

<components namespace="dao_mysql">
  <include path="j2ee-mysql.dicon"/>
  <include path="j2ee.dicon"/>
  <!-- 以下省略 -->

 これで、両方のdiconファイルをincludeして、Daoに適用するintercepterを
使い分ければ、ひとつのdiconファイル内で複数のデータソースを使い分ける
ことができます。

> その他の状況として
> j2ee.dicon の dataSource、xaDataSource、connectionPool をコメントすることで以下のエラーがTomcatの起動時に表示されます。
> 「org.seasar.dao.impl.DaoMetaDataFactoryImplの引数(interface javax.sql.DataSource)が見つからないのでnullを設定します」

 この警告も、上のやり方をやったら出なくなるはずです。ここが、Daoに
データソースを渡している場所だからです。

 説明が下手で余計に混乱させてしまったら、申し訳ないです。


-- 
 Jundo Ishikawa <[E-MAIL ADDRESS DELETED]>



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