[seasar-dotnet:1169] Re: [DBFlute] 複数データソースに関して

koyak [E-MAIL ADDRESS DELETED]
2008年 11月 22日 (土) 01:16:18 JST


高井さん

小谷です。

最初にお知らせいただいた
>XxxS2DaoSetting の DataSourceName プロパティを追記しました。
>すると、ログにはデータソースを設定した(「SetDataSource=DS2」のようなログ)
>旨の記述が出るのですが、利用されるデータソースは切り替わりませんでした。

についてですが、
Dao単位で固定のデータソースを指定したい場合は
高井さんがなさった上記の対応(DataSourceNameプロパティでデータソース名を返す)で
OKのはずです。

XxxDaoSettingのDataSourceNameがnull以外を返す場合
S2DaoInterceptorの前にもう一つデータソース名を切り替えるInterceptorが
かかるようになっています。

ログで「SetDataSource=DS2」と出力され、その後にS2DaoInterceptorが
呼ばれているということはInterceptorは正常に呼ばれており、
データソース名の設定も正常に行われているように見えます。

データソース名の設定が実際にどこまで正常に行われているかを確認するため、
データソースの取得直前にデータソース名をログ出力するように修正したコードを
コミットしました。

お手数ですが、
https://www.seasar.org/svn/s2container.net/
から最新のソースコードを取得し、コンパイルしたDllに置き換えて
再度動かしてみていただけないでしょうか。

--------------------------------------------------------------------------------------

データソース切替の仕組みについては以下のような形になっています。

Quill内部では設定されているデータソースの種類、数に関わらず
共通して「SelectableDataSourceProxyWithDictionary」というデータソースを
使っています。
設定ファイルに記述されたデータソースはこの中に保持されます。

SelectableDataSourceProxyWithDictionary#SetDataSourceName
を呼ぶと引数に渡されたデータソース名を保持します。
(スレッドごとに一意に保持します)

DBに接続するときはまずSelectableDataSourceProxyWithDictionary#GetDataSource
が呼ばれ、保持しているデータソースのコレクションから
直前のSetDataSourceNameで設定されたデータソース名をキーにして
データソースを取り出して返します。
(一度もSetDataSourceNameが呼ばれていない場合は設定ファイル内で
最初に定義されているデータソース名を使用します)

SetDataSourceNameでデータソース名を変更すると
GetDataSourceが呼ばれたときにデータソースを探すキーも変わり、
このことによってデータソースの切替を行っています。

※現時点(1.3.12)では2相コミットなどの仕組みは実装していないため
複数のデータソースにまたがるトランザクションをかけることはできません。
1トランザクション1データソースとしてご利用下さい。

==============================
koyak
[E-MAIL ADDRESS DELETED]
==============================

2008/11/21 19:46 takai <[E-MAIL ADDRESS DELETED]>:
> 小谷様
> 高井です。
>
>> Quillの方で静的なデータソース設定ができないか今夜にでも考えてみます。
>> できましたらお知らせしますのでSNAPSHOT(subversionからソースを取得)で
>> お試しいただけますでしょうか。
>
> ありがとうございます。
> 完成したらすぐにも利用させてください。
>
>
>> >データソースを設定した旨のログが出ているにもかかわらずデータソースが切り
>> >替わらないのが謎です。
>> これに関してはまた別の問題かもしれません。
>> こちらも調べてみます。
>
> よろしくお願いします。
>
>
>> >データソースの切り替えの仕組みはどのようになってるか簡単に説明していただ
>> けるとありがたいです。
>> こちらも(私事で恐縮ですが)帰宅後に改めて書かせていただこうと思います。
>
> こちらも是非お願いします。
> 裏の仕組みがわかっていると拡張が楽になったり、作ったアプリとかのバグの切
> り分けがしやすくなるので助かります。
>
>
>> 高井さん
>>
>> 横から失礼します。
>> 小谷です。
>>
>> Quillの方で静的なデータソース設定ができないか今夜にでも考えてみます。
>> できましたらお知らせしますのでSNAPSHOT(subversionからソースを取得)で
>> お試しいただけますでしょうか。
>>
>> >データソースを設定した旨のログが出ているにもかかわらずデータソースが切り
>> >替わらないのが謎です。
>> これに関してはまた別の問題かもしれません。
>> こちらも調べてみます。
>>
>> >データソースの切り替えの仕組みはどのようになってるか簡単に説明していただ
>> けるとありがたいです。
>> こちらも(私事で恐縮ですが)帰宅後に改めて書かせていただこうと思います。
>>
>>
>> 2008/11/21 18:36 kubo <[E-MAIL ADDRESS DELETED]>:
>> > 久保(jflute)です。
>> >
>> > 高井さん、すいません
>> >
>> > https://www.seasar.org/issues/browse/CONTAINERNET-88
>> >
>> > をすっかり失念しておりました。
>> > (以前、複数DBで投稿された方もうまくいってないんじゃ!?)
>> > DBFluteとしては「Quillでの対応待ち」という感じです。
>> >
>> > テンプレートを修正して、無理矢理設定するようにすれば
>> > 今でもできないことはないと思います。
>> > (S2DaoInteceptorとかでベタッと書いてしまう)
>> > もし、次バージョンが出るまでとりありず動く環境を構築
>> > しないといけないようであれば、それで回避お願いします。
>> >
>> > 2008/11/21 takai <[E-MAIL ADDRESS DELETED]>:
>> >> 久保様
>> >> 高井です、早い返信ありがとうございます。
>> >>
>> >>
>> >> S2.net のバージョンを記述するの忘れていました。
>> >> 最新の 1.3.12 を利用してます。
>> >>
>> >>> > 今インスタンスが別々の複数の DB に接続するアプリケーションで
>> >>>
>> >>> というのは、
>> >>> 「テーブル構造の違うDBが複数ある」
>> >>> という認識でよろしいでしょうか?
>> >>>
>> >>> よくあるのですが、「複数DB」と言った時に、
>> >>> A. 「テーブル構造の違う(DBの種類も違うかも)別のDB」
>> >>> B. 「テーブル構造が同じ負荷分散のための別のDB」
>> >>> を混同することが多いので確認です。
>> >>>
>> >>> 個人的には「複数DB」というと基本的には「A」を想定するのですが...
>> >>> 以下とりあえず「A」を前提にお話します。
>> >>
>> >> A のテーブル構造が違うDBが複数あるという認識で合っています。
>> >>
>> >>
>> >>> > DBFlute のページに記述されている複数 DB 利用時の手順に従って
>> >>> > ソースの自動生成まではできたのですが、プログラムがうまく動作しません。
>> >>>
>> >>> こちら、具体的にそのページはどこでしょうか?
>> >>> (URLを頂けます?)
>> >>
>> >> http://dbflute.sandbox.seasar.org/contents/setup/multipledb.html
>> >> です。
>> >>
>> >>
>> >>> DBFluteで「複数DB」するときは、基本的に
>> >>> DBFluteクライアントを複数作成します。
>> >>>
>> >>> dbflute_abc/...
>> >>> dbflute_def/...
>> >>> mydbflute/dbflute-0.8.5
>> >>>
>> >>> 「ABC」用のDBFluteと「DEF」用のDBFluteと作成し、
>> >>> DBFlute本体モジュールは同じものを利用します。
>> >>> 生成されるクラスも同じNamespaceではなく、
>> >>> それぞれ独立したNamespaceに生成します。
>> >>>
>> >>> DBFluteは上記のような構成になっていますでしょうか?
>> >>
>> >> この構造になっています。
>> >> 生成されたソースは各DB毎に異なる Namespace になっています。
>> >>        Proj.DB1.Aaaa ...
>> >>        Proj.DB2.Bbbb ...
>> >>        Proj.DB3.Cccc ....
>> >> のような感じです。
>> >>
>> >>
>> >>> 詳しくは、
>> >>> https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-multipledb-example
>> >>> のreadme.txtをお読み下さい。
>> >>> dbflute-multipledb-exampleは複数DBのExampleです。
>> >>> (Java版ですが、考え方・構成はほとんど同じです)
>> >>>
>> >>> また、「seasar-dotnet:1135」も複数DBの話題ですので参考になります。
>> >>
>> >> これらも参考にしてみたのですが、うまくいきませんでした。
>> >> Quill を利用すると少し違うのかも...?
>> >>
>> >>
>> >>> > SelectableDataSourceProxyWithDictionary
>> >>>
>> >>> もし「A」の場合は、基本的にSelectableDataSourceProxyWithDictionaryの
>> >>> 利用は不要のはずです。これは「B」のためのクラスです。
>> >>
>> >>> すいません、こちらちょっと保留させて下さい。
>> >>> Javaだと確実にそうなのですが、Quillだと違うかも!?
>> >>
>> >> SelectableDataSourceProxyWithDictionary が App.config に定義されているデー
>> >> タソースをすべて保持してました。
>> >> これが保持しているデータソースが自動生成された DaoSettings の
>> >> DataSourceName によって自動的に切り替えられることで Bhv が正しい DB に接
>> >> 続できるのかと思ってました。
>> >>
>> >> データソースを設定した旨のログが出ているにもかかわらずデータソースが切り
>> >> 替わらないのが謎です。
>> >>
>> >> Bhv が利用するデータソースの切り替えの仕組みがどうなっているかがわかると
>> >> いいのですが、google ったり生成されたソースと Quill のソースを読んでみた
>> >> ところ見つけられませんでした。
>> >> データソースの切り替えの仕組みはどのようになってるか簡単に説明していただ
>> >> けるとありがたいです。
>> >>
>> >> _______________________________________________
>> >> seasar-dotnet mailing list
>> >> [E-MAIL ADDRESS DELETED]
>> >> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> >>
>> > _______________________________________________
>> > seasar-dotnet mailing list
>> > [E-MAIL ADDRESS DELETED]
>> > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> >
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
> --
> Takai ICT 株式会社
> 高井朋幸 <[E-MAIL ADDRESS DELETED]>
> TEL: 090-6192-6789
> http://www.takaiict.com/
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


seasar-dotnet メーリングリストの案内