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

koyak [E-MAIL ADDRESS DELETED]
2008年 10月 24日 (金) 22:16:47 JST


大下さん

小谷です。

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

良かったです!!
多分、Seasar.NETとしてもかなり貴重な事例なるのではないかと思います。

さて、トランザクションのメッセージの件ですが
対応策の前に一つお尋ねさせて下さい。
大下さんのプロジェクトでは「log4net」はお使いでしょうか?

「log4net」というのはオープンソースの大変便利なログ出力ライブラリです。
http://d.hatena.ne.jp/keyword/log4net

app.configに必要な設定を書いてやればコンソールやファイルに
ログを出力することができます。

Seasar.NETでも内部でのログ出力にlog4netを使用しており、
「トランザクションの開始」「ロールバック」「コミット」などのメッセージも
log4netの設定があればSeasarの方で出力します。

トランザクション関係のメッセージに限って言えば
ログ出力の仕組やメッセージ内容の書式等が決められているのでなければ
こちらの方がコストは低いかと思います。


上記の対応では駄目(どうしてもAspectをかけて独自にメッセージ処理をする必要がある)
な場合についてですが、こちらも対応策の前に一つお教え下さい。

ConsoleWriteInterceptorのAspectはうまくいっている、とのことですが、
うまくいっていない方(トランザクション関係のメッセージを出そうとしている方?)の
Interceptorの実装はどのようになっていますでしょうか?
(もしかするとクラスの方でAspect属性を使ってかけているTraceInterceptor
の話でしょうか?)

以上です。
よろしくお願いします。

2008/10/24 11:01 Yoshihiro OSHITA <[E-MAIL ADDRESS DELETED]>:
> 小谷様、
> お世話になっています、大下です。
>
> 小谷さんがおっしゃるような対応をコードに施したところ、
> 正常に動作するようになりました。
> ありがとうございました。
>
> 私が提示していた要件は、ほぼ満たされているのですが、
> トランザクションのメッセージも表示させたいと考えています。
> 現在、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.についての対応をお願い致します。
>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
>


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