[seasar-dotnet:2276] Re: Quill、DBFluteでの同一DB、複数スキーマ、同一テーブル構造での接続について

kubo [E-MAIL ADDRESS DELETED]
2013年 4月 26日 (金) 01:35:32 JST


久保(jflute)です

C#はスレッドローカルが属性指定で簡単に
実現できるようで、知らないと逆に不安なコード
に見えたりもしますね(^^

> こんどはまたちょっと難しそうですが、
> これをAOPとやらを使って実装したいと思います。
頑張ってみて下さい!
もしわからないことがあればまた気軽に聞いて下さい。
(答えられるかどうかはわかりませんが...(m_m


2013/4/26 志水正幸 <ie2m-smz @ asahi-net.or.jp>:
> 志水です。
>
> 久保さん、ありがとうございます。
>
> なるほど、[ThreadStatic] 部分を当ててみると
> なにやら、そげなことを言ってますね。
> 同時テストの仕方がわからないので
> 頑張って同時に叩いていたんです。
> 問題が発生しなくて逆に不安だったので、安心しました。
> こんどはまたちょっと難しそうですが、
> これをAOPとやらを使って実装したいと思います。
> 救いのご教授ありがとうございました。
>
>
>
> (2013/04/25 23:30), kubo wrote:
>> 久保(jflute)です
>>
>> 志水さん、こんばんは
>> DBFluteご利用ありがとうございます!
>>
>>> メーリングリスト[seasar-dotnet:1169]を見つけました。
>>> これを参考に実装したら切替えできました。
>> とりあえず実装できたということでよかったです。
>>
>>> 「スレッドごとに一意に保持します 」
>> SelectableDataSourceProxyWithDictionaryを見ると、
>>
>> [ThreadStatic]
>> private static string _dataSourceName;
>>
>> となっていて、データソース名が
>> スレッドローカル管理となっているため、
>> どんだけリクエストが飛んできても、
>> 他のリクエストが別のリクエストの接続先に
>> 影響を与えることはないはずです。
>>
>>
>> 2013/4/25 志水正幸 <ie2m-smz @ asahi-net.or.jp>:
>>> 志水です。
>>>
>>> また自己レスですが、
>>> メーリングリスト[seasar-dotnet:1169]を見つけました。
>>> これを参考に実装したら切替えできました。
>>> こんなに簡単にデータソース切替えができたんですね。
>>>
>>> このメーリングリストの中で、「スレッドごとに一意に保持します 」と
>>> うたっているので、複数同時に同じWEBページを参照されても、
>>> 当該ページ内で参照するユーザによって切替えられたデータソースは
>>> このページ内での処理中は保持されるので、
>>> 参照されるDB先は保証されると考えてよいのでしょうか?
>>>
>>> 以上、ご教授お願いいたします。
>>>
>>>
>>>
>>> *-----------------------------------------------------------------------*
>>> [seasar-dotnet:1169] Re: [DBFlute] 複数データソースに関して
>>>
>>> データソース切替の仕組みについては以下のような形になっています。
>>> Quill内部では設定されているデータソースの種類、数に関わらず
>>> 共通して「SelectableDataSourceProxyWithDictionary」というデータソースを
>>> 使っています。
>>> 設定ファイルに記述されたデータソースはこの中に保持されます。
>>>
>>> SelectableDataSourceProxyWithDictionary#SetDataSourceName
>>> を呼ぶと引数に渡されたデータソース名を保持します。
>>> (スレッドごとに一意に保持します)
>>>
>>> DBに接続するときはまずSelectableDataSourceProxyWithDictionary#GetDataSource
>>> が呼ばれ、保持しているデータソースのコレクションから
>>> 直前のSetDataSourceNameで設定されたデータソース名をキーにして
>>> データソースを取り出して返します。
>>> (一度もSetDataSourceNameが呼ばれていない場合は設定ファイル内で
>>> 最初に定義されているデータソース名を使用します)
>>>
>>> SetDataSourceNameでデータソース名を変更すると
>>> GetDataSourceが呼ばれたときにデータソースを探すキーも変わり、
>>> このことによってデータソースの切替を行っています。
>>>
>>> ※現時点(1.3.12)では2相コミットなどの仕組みは実装していないため
>>> 複数のデータソースにまたがるトランザクションをかけることはできません。
>>> 1トランザクション1データソースとしてご利用下さい。
>>>
>>> *-----------------------------------------------------------------------*
>>>
>>>
>>>
>>> (2013/04/25 19:41), 志水正幸 wrote:
>>>
>>> 志水です。
>>>
>>> アナログですが、
>>> サンプルの会員登録を2つのブラウザで、同時実行したところ
>>> 登録は各スキーマで実施していましたが、
>>> 戻りの検索一覧画面の一覧が同一スキーマから
>>> データを読み出ししていました。
>>> このやり方では無理そうですね。
>>> いけそうだと思ったんだけどなぁ。。
>>> 何がいけないんだろう??
>>>
>>>
>>> (2013/04/25 17:21), 志水正幸 wrote:
>>>
>>> 志水と申します。
>>>
>>> 【環境】
>>> 開発OS:Windows7 64bit
>>> DB-Server:Windows2008std
>>>
>>> C# FrameWork4.0
>>> Oracle11g
>>> Quill(s2container.net-1.4.0)
>>> DBFlute0.8.9.50
>>> ソース元は、dfnet-asp.net-example
>>>
>>> 初めてQuill、DBFluteを利用させていただいております。
>>> ASP.NET(WEB)、C#も初心者ですが、一応、Java経験者です。
>>>
>>> 下記の要件でWEBアプリを作成したく
>>> 初めてづくしですが、いろいろとネットで調べて実装してみました。
>>> DBFluteやQuillの複数DB、スキーマについての説明も
>>> 読ませていただきました。はっきり言って難しいです。
>>> あんまりよく理解できていないなりに、実装を行い、
>>> 何とか読込もできましたし、更新もできました。
>>>
>>> しかしWEBで下記の要件を実装した場合に
>>> 多ユーザでの同時実行時に、トランザクション動作など、
>>> はたして本当にこのような実装方法で問題ないのかが
>>> はっきり言って理解不足で、投稿させていただいた次第です。
>>> 何か注意点や、より良い実装方法等あれば、ご教授お願いいたします。
>>>
>>> <要件>
>>> 同じデータベースで、・スキーマが違い、同一テーブル構造を持つ
>>> データベース環境に対して、アプリケーション側のログイン画面で
>>> ログインしたユーザの所属からユーザ専用のスキーマへ接続する。
>>> ※スキーマ間のアクセスは行わない。
>>>
>>> <DBFLUTE>
>>> 1.「dbflute_xxxxxx」で基本となるモジュールを一つだけ、generate.batで作成する
>>> 2.A社用(dbflute_corpA)、B社用(dbflute_corpB)・・・・のスキーマを作成
>>> 3.databaseInfoMap.dfpropの接続先をA社用、B社用・・・と変更しながら
>>>   replace-schema.batを実行して、各スキーマに実テーブルを作成する。
>>>
>>> <aspx側>
>>> ・宣言
>>>   Protected _dataSourceDict As SelectableDataSourceProxyWithDictionary
>>> ・ページロード
>>>             String corpcd = [画面データの会社コード]
>>>
>>>             DataSourceImpl ds =
>>> _dataSourceDict.DataSourceCollection["Dfxxxxxx"] as TxDataSource;
>>>             ds.ConnectionString = "Data Source=XE ;User Id=user_" + corpcd +
>>> ";Password=pass_" + corpcd ;
>>> ・会社毎に専用スキーマに接続して、読込/更新などの処理を行う。
>>>  DBFLUTEのモジュールは「dbflute_xxxxxx」を共通で使用する。
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> seasar-dotnet @ ml.seasar.org
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> seasar-dotnet @ ml.seasar.org
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>>
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> seasar-dotnet @ ml.seasar.org
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> seasar-dotnet @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet


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