[seasar-dotnet:1093] Re: 動的に複数DBファイルを作成して、複数同時にアクセス

Yoshihiro OSHITA [E-MAIL ADDRESS DELETED]
2008年 10月 24日 (金) 11:01:33 JST


小谷様、
お世話になっています、大下です。

小谷さんがおっしゃるような対応をコードに施したところ、
正常に動作するようになりました。
ありがとうございました。

私が提示していた要件は、ほぼ満たされているのですが、
トランザクションのメッセージも表示させたいと考えています。
 現在、DAOに定義しているinsertメソッドをコールしたときに
「トランザクションをコミットした」などのメッセージが表示されておりません。
DAOは以下のようなコードを書いております。
(実験用に書いたConsoleWriteInterceptorはうまくAspectできているようです。)
なにか足りない設定などはありますか?

--------
namespace MySelectDataSourceSample
{
   [S2Dao]
   [Aspect(typeof(TraceInterceptor))]
   [Implementation]
   [Bean(typeof(Library))]
   public interface ILibraryDao
   {
       Library[] GetAllLibraries();

       [Aspect(typeof(ConsoleWriteInterceptor))]
       [Transaction]
       int Insert(Library library);
   }

   #region Interceptorの実験
   public class ConsoleWriteInterceptor : IMethodInterceptor
   {
       #region IMethodInterceptor メンバ

       public object Invoke(IMethodInvocation invocation)
       {
           MethodBase method = invocation.Method;
           Console.WriteLine("▽"+method.Name+"メソッドを開始します");

           // 実際の処理を実行する
           object ret = invocation.Proceed();

           Console.WriteLine("△"+method.Name+"メソッドを終了します");

           return ret;
       }
       #endregion
   }
   #endregion Interceptorの実験
}
---------

2008/10/21 2:16 koyak <[E-MAIL ADDRESS DELETED]>:

> 大下さん
>
> 小谷です。
>
> 確かに私が前のメールで書いた修正では
> データソース全部が予め設定ファイルに
> 書いてあるとき用のものでした。
> Inject実行後に追加されたデータソースについては
> NullReferenceExceptionが起きてしまいますね。
>
> 今回の大下さんの要件にはそぐわないものです。
> 失礼しました。
>
> 大下さんがなさっているように
> 新しく生成したデータソースにTransactionContextを
> 設定してやる必要があります。
>
> ただ、CreateTxDataSourceを呼ぶ度にTransactionContextの
> インスタンスが新しく生成されるのはやはり
> トランザクションが想定通りに動かない危険があります。
>
> そのため、TransactionContextの設定には
> QuillContainer内で保持しているTransaction設定クラス
> (特に設定していない場合は
> Seasar.Quill.Database.Tx.Impl.TypicalTransactionSetting)
> を使ってみていただけないでしょうか。
>
> やり方は以下のようになります。
> 1.TxSetupperにITransactionSetting型のプロパティを追加する
> 2.Mainメソッド内でinjector.InjectとtxSetup.CreateTxDataSourceの間に
> TypicalTransactionSettingのインスタンスを取り出すコードを追加
> (下記コードで取得できます)
> (ITransacionSetting)ComponentUtil.GetComponent(
>  injector.Container, typeof(TypicalTransactionSetting));
> 3.1で作ったプロパティに2で取得したインスタンスを渡す
> (これもCreateTxDataSourceを呼ぶ前に)
>
> 後はCreateTxDataSource内の修正になります。
> ITransactionSettingには「TransactionContext」
> というプロパティがあります。
> これをTxDataSourceのCotextプロパティに渡します。
>
> 「// TransactionContext」〜return文の1行上までの処理は
> (Transaction属性が使われていれば)TypicalTransaction#SetupTransactionが
> injector.Inject実行時に呼び出され設定済になっているはずなので
> なくても大丈夫だと思います。
> (本当に設定済みになっているかどうかはITransactionSettingのIsNeedSetupメソッドで
> 確認できます。falseが返ってきていれば設定済です。)
>
> ※私事になってしまい、恐縮なのですが
> 21日午後〜24日午前までネットが使えない環境になります。
> 返信が遅れてしまうと思いますが、どうぞご了承下さい。
>
> 2008/10/20 21:06 Yoshihiro OSHITA <[E-MAIL ADDRESS DELETED]>:
>  > 小谷様、
> > お世話になっています、大下です。
> > 返信が遅くなり、申し訳ありません。
> >
> > 小谷さんの助言を無視するようなコードになっていて申し訳ないのですが、
> > 添付ファイルにあるようなコードをかいてみたところ動作しました。
> > ただ、
> > >CreateTxDataSourceが呼ばれる度に
> > >・TransactionContextクラスのインスタンスが作られる(一つであるべき)
> > >・共通データソースのSelectableDataSourceProxyWithDictionaryが
> > >新しく作られたTxDataSourceのインスタンスで上書きされる
> > >という処理が流れるため
> > >正常にDBアクセス、トランザクションが行えなくなります。
> >
> > ということなので、このコードだとまずいということですよね。
> > よって、
> >
> > >1.
> > >TxSetupper#CreateTxDataSourceの
> > >「// TransactionContext」から最後のreturn文の一行前までは
> > >削除する必要があると思います。
> > としてみたところ、以下のような例外が発生いたしました。
> > --------
> > ハンドルされていない例外: System.NullReferenceException: オブジェクト参照がオブジェクト
> > インスタンスに設定されていません。
> > 場所 Seasar.Extension.Tx.Impl.TxDataSource.GetConnection()
> > 場所 l:\…\MyS2DaoSample\Seasar\Seasar.Extension.Tx\Impl\TxDataSource.cs:行51
> > 場所
> Seasar.Extension.ADO.Impl.AbstractSelectableDataSourceProxy.GetConnectio
> > n()
> > 場所 l:\
> >
> …\MyS2DaoSample\Seasar\Seasar.Extension.ADO\Impl\AbstractSelectableDataSourceProxy.cs:行
> > 70
> > 場所 MySelectDataSourceSample.LibraryLogic.InitTable()
> > 場所 l:\ …MyS2DaoSample\MySelectDataSourceSample\Program.cs:行 45
> > 場所 MySelectDataSourceSample.Program.Main(String[] args)
> > 場所 l:\…\MyS2DaoSample\MySelectDataSourceSample\Program.cs:行 179
> > 続行するには何かキーを押してください . . .
> > --------
> > TransactionContextは、どのタイミングで作成してやるべきなのでしょうか。
> >
> > 2008/10/20 1:47 koyak <[E-MAIL ADDRESS DELETED]>:
> >>
> >> 大下さん
> >>
> >> またもや連続投稿失礼します。
> >> 小谷です。
> >>
> >> >2.
> >> >折角登録したデータソースの名前を指定(SetDataSourceNameを呼ぶ)
> >> >しているコードが(貼り付けていただいた範囲のコードには)見当たりません。
> >>
> >> 大変失礼しました!
> >> Main関数の中でちゃんと呼ばれていますね。
> >> 2については撤回させて下さい。
> >>
> >> 1.についての対応をお願い致します。
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-dotnet/attachments/20081024/88a5150f/attachment-0001.html>


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