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

koyak [E-MAIL ADDRESS DELETED]
2008年 11月 22日 (土) 22:46:00 JST


高井さん

小谷です。

検証ありがとうございます。
お知らせいただいた下記のコード&現象についてですが
>  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 が利用されるので動く

確かにトランザクションのデータソースを取得するタイミングの都合上
(S2DaoInterceptorよりも前にTransactionInterceptorが呼ばれる)、
直前に使われたデータソースでトランザクションを発行しようと
してしまっていますね。

対策として臨時にITransactionSetting(トランザクション設定クラス)に
プロパティ「DataSourceName」を追加し、
Transactionがかかる前にもDataSourceNameが変更されるように
コードを変更しました。

Subversionから最新(revision=1055)のソースを取得し、コンパイルしたDLL
+
DaoSettingと同じ要領でDataSourceNameを返す
TransactionSettingを作成
+
logic.SelectListで使っているTransaction属性に
作成したTransactionSettingのTypeを渡す

という修正をお手数ですが試していただけないでしょうか。
(データソース名はトランザクション側とbhv側で揃えるようにして下さい)

もしそれでもエラーが発生するようでしたら
例外クラス(SQLExceptionだと思いますがInnerExceptionがある場合はそれも)
例外メッセージ
例外発生箇所
も差し支えない範囲で教えていただけたらと思います。

2008/11/22 18:01 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保(jflute)です。
>
> ご報告ありがとうございます。
> このままリリースしますね。
>
>
>> Transaction をかけなければ正常に動作することが確認できました。
>> ログの方も必要な時に必要なデータソースが設定されているようです。
>
> あとは残りはこっちの問題ですかぁ。。。
> Quillのトランザクション周りの問題かもしれませんね。
>
>
> 2008/11/22 takai <[E-MAIL ADDRESS DELETED]>:
>> 久保(jflute)様
>> 高井です。
>>
>> quillDataSourceName 対応ありがとうございます。
>> 早速試してみたところ、DataSourceName プロパティが設定されていてしっかり
>> 動いてくれました。
>>
>>
>>> 久保(jflute)です。
>>>
>>> 高井さん
>>>
>>> Quillの方が(実は!?)既に固定データソースに対応しているようなので、
>>> DBFluteのquillDataSourceName実装しました。
>>> (実際に利いてない問題はありますがQuill側の話のようなので)
>>>
>>> http://dbflute.sandbox.seasar.org/contents/migration/basic.html
>>>
>>> こちらも
>>> 「0.6.5においてまだ未実装」を
>>> 「0.6.5においてまだ未実装→0.8.6より実装」に
>>> 変更しております。
>>>
>>> 0.8.6は
>>> http://dbflute.sandbox.seasar.org/contents/migration/basic.html
>>> からダウンロード可能です。
>>> またリリース前のSNAPSHOTではありますが、
>>> これで特に問題なければそのままリリース準備に入りたいと思います。
>>>
>>>
>>> 2008/11/22 takai <[E-MAIL ADDRESS DELETED]>:
>>> > 小谷様
>>> > 高井です。
>>> >
>>> > 早速の対応とデータソース切り替えの解説ありがとうございます。
>>> > 手元に環境がないため 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相コミットは考えていないので今のところは必要ありません。
>>> >
>>> > 引き続きよろしくお願いします。
>>> >
>>> >


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