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

koyak [E-MAIL ADDRESS DELETED]
2008年 10月 21日 (火) 02:16:03 JST


大下さん

小谷です。

確かに私が前のメールで書いた修正では
データソース全部が予め設定ファイルに
書いてあるとき用のものでした。
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 メーリングリストの案内