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

Yoshihiro OSHITA [E-MAIL ADDRESS DELETED]
2008年 10月 26日 (日) 01:14:23 JST


小谷様、
お世話になっています、大下です。
返信が遅くなってしまい、申し訳ありません。

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

ネットや過去のMLに同じような情報がないので、自分でMLに投稿するしかないと思いました。
ここまで辿りつけたのも久保さんや小谷さんが丁寧に説明してくださったおかげです。
ありがとうございます。

>大下さんのプロジェクトでは「log4net」はお使いでしょうか?

存在は知っていたのですが、実際に使ったのはS2Dao.NETのサンプルを作ったとき利用したのが初めてです。
便利なので、実際のプロジェクトでも採用しようと考えています。

Seasar.NETでも内部でのログ出力にlog4netを使用しており、
> 「トランザクションの開始」「ロールバック」「コミット」などのメッセージも
> log4netの設定があればSeasarの方で出力します。
>
> トランザクション関係のメッセージに限って言えば
> ログ出力の仕組やメッセージ内容の書式等が決められているのでなければ
> こちらの方がコストは低いかと思います。


 はい、メッセージ内容の書式は今のところデフォルト(というかS2Container.NETのドキュメントに書かれているサンプル)の設定を利用するつもりです。
上記のように小谷さんが仰っているのを読んでいて気づいたのですが、app.configにlog4netの設定を書いていませんでした。Quill=設定ファイル書かないでOK
となんか勝手に思い込んでいましたが、app.configは別ですね。
以下の内容を書くことで、トランザクションのメッセージも表示できるようになりました。
よって、質問していた内容は解決です、ありがとうございます。
App.config-------
 ・・略・・
  <log4net>
    <appender name="ConsoleAppender"
type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-5p %d [%t] %m%n" />
      </layout>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>
 ・・略・・
--------------

Interceptorの実装はどのようになっていますでしょうか?
> (もしかするとクラスの方でAspect属性を使ってかけているTraceInterceptor
> の話でしょうか?)


そうです、お察し通り、自分でDAOのInsertメソッドにTraceIntercepor属性を適用してみたりしておりました。
まったく的外れでした。失礼しました。

今回、小谷さんが助言してくださった内容を実際のプロジェクトにも適用して、作業を進めていこうと思います。
実際に適用してみて、問題がでてくるかもしれませんが、そのときは解決方法についてまた相談に乗っていただけると助かります。ありがとうございました :-)

2008/10/24 22:16 koyak <[E-MAIL ADDRESS DELETED]>:

> 大下さん
>
> 小谷です。
>
> > 小谷さんがおっしゃるような対応をコードに施したところ、
> > 正常に動作するようになりました。
> > ありがとうございました。
>
> 良かったです!!
> 多分、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.についての対応をお願い致します。
>
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-dotnet/attachments/20081026/34f4e4cc/attachment.html>


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