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