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

takai [E-MAIL ADDRESS DELETED]
2008年 11月 22日 (土) 13:32:07 JST


小谷様
高井です。

早速の対応とデータソース切り替えの解説ありがとうございます。
手元に環境がないため PostgreSQL で動く簡単な環境を作ってスナップショット
の動作確認してみました。

Transaction をかけなければ正常に動作することが確認できました。
ログの方も必要な時に必要なデータソースが設定されているようです。
1.0.12 では Transaction 属性にかかわらずデータソースが切り替わらなかった
のですが、何かそのあたりも修正されました?(されてないようなら私の設定ミ
スだったのかも)

ただ、Transaction 属性を利用したメソッドを呼び出すとうまく切り替わってく
れないみたいです。
Transaction 属性を利用したクラスのメソッド内で、そのクラスのフィールドに 
Quill で設定された Bhv が呼び出されると前に利用されたデータソースが強制
的に設定されてしまうようです。
ログにはやはり正しいデータソースが設定されているように出力されます。

以下のようなコードで、ロジックの実装クラス内部で DS1 へアクセスする Bhv 
を利用していて、ロジック実装クラスに Transaction 属性をかけてあります。

protected IXxxLogic logic; // これの実装クラスに [Transaction]
protected Ds1Bhv bhv1;
protected Ds2Bhv bhv2;

...
  bhv1.SelectList(cond1);
  bhv2.SelectList(cond2);
  bhv1.SelectList(cond1);
  bhv2.SelectList(cond2);  // ここまでは正常終了
  logic.SelectList(cond1); // Transaction を使うと SQL エラー
...

となりますが、以下のようにすると動きます、

...
  bhv1.SelectList(cond1);
  bhv2.SelectList(cond2);
  bhv1.SelectList(cond1);
  bhv2.SelectList(cond2); 
  bhv1.SelectList(cond1);
  logic.SelectList(cond1); // 直前の DS が利用されるので動く
...


Transaction 属性の処理に問題がありそうな気がします。
ちなみに、2相コミットは考えていないので今のところは必要ありません。

引き続きよろしくお願いします。


> 高井さん
> 
> 小谷です。
> 
> 最初にお知らせいただいた
> >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 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 メーリングリストの案内