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

kubo [E-MAIL ADDRESS DELETED]
2013年 4月 25日 (木) 23:30:08 JST


久保(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 メーリングリストの案内