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

kubo [E-MAIL ADDRESS DELETED]
2013年 5月 29日 (水) 16:12:19 JST


久保(jflute)です

情報交換の場としてご利用ありがとうございます(^^。
こういった活用はとっても大歓迎です。

補足としては、
Quillで管理するコンポーネントは全て singleton です。
アプリケーション上にインスタンスは一つとなります。

また、「ダメかどうか」は、
やはりこの場では誰にも判断できないもので、
OSSなのでソースレベルで論理的に大丈夫かどうか
ってのを議論する方向か、別のユーザーの実績を
共有して自分で判断していくという感じですね。




2013/5/29 志水正幸 <ie2m-smz @ asahi-net.or.jp>:
> koalaさん、こんにちは。
>
> 志水です。
>
> すいません、ダメかどうかは私にも判断できないです。
> 私はJavaでのWEB経験者ですが、ASP.NET C# Quill DBFlute はすべて初心者で すので。
>
> Quillはsingleton らしいです。HPに書いてますね。
> 私も正直よくわかっていませんが(^ ^;
> ただsingleton ってインスタンスが一つっていう意味だけですよね。
> 誰かが内容を書き換えちゃえば、それを参照している人も
> 書き換えた内容になるんだと思います。
> だから、HPでもセッション関連はQuill管理下で作っちゃダメって言っているん だと理解してます。
>
> なので、singleton かどうかで、接続が担保できるかどうかということにはなら ないと思うんですよね。
> 実際にPage_Loadで下記のようなメソッドをCALLしてみて
> 同時アクセスやってみたら、見事に意図した接続先とは違う接続に変わってし まってたし。
>
>  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 ;
>
>
> で、いろいろ調べてたらメーリングリスト[seasar-dotnet:1169]を発見して
> 下記のやり方に落ち着きました。※Googleで検索してみたらでますよ。
>
> 下記のメソッドをaspxの画面基底のPage_LoadでCALLしています。
> あとは、この画面基底のaspxを通常の画面で継承しています。
> 利点は「_dataSourceDict.SetDataSourceName」はスレッドローカルで動くので、
> 他ユーザに干渉されず、処理中は接続が担保できるという点です。
>
> もし、画面毎なりユーザ毎などの条件で接続が決まるのであれば、こちらのやり 方の方が
> スマートなんじゃないかと思います。
>
> ※ただですね、このやり方がいいか悪いかは私にもわかりません。
> メーリングリストにもこれでOKとはなってませんし。
> Quill内部では、
>
> 「SelectableDataSourceProxyWithDictionary」を使用して
> SelectableDataSourceProxyWithDictionary#SetDataSourceNameで切替えしている
> と書いているので良いのかと。
>
> 実装はしていますが、こちらの現案件は、一つの接続先が前提で、
> 今後の拡張を考えての実装なので、深くテストもしてません。
> 必要になったらいろんなテストするつもりなので。
> そこはご了承くださいまし。
>
>         /// <summary>
>         /// データソース変更
>         /// </summary>
>         protected void DataSourceChange(SessionUserDto sessionUserDto)
>         {
>             //データソース名。デフォルトは基本データソース名
>             String datasourceNm =
> GenericUtilities.Utilities.StaticReadonlyDefine.DATASOURCE_SIKEIRIWEB_BASIC;
>
>             //セッションが存在する場合
>             if (sessionUserDto != null)
>             {
>                 //県コードが存在する場合
>                 if (!String.IsNullOrEmpty(sessionUserDto.KenCd))
>                 {
>                     //使用するデータソースをセットする。県コード毎に データソース名が動的に決まる。
>                     datasourceNm =
> GenericUtilities.Utilities.StaticReadonlyDefine.DATASOURCE_SIKEIRIWEB_DYNAMIC
> + GenericUtilities.Utilities.StaticReadonlyDefine.UNDVAR +
> sessionUserDto.KenCd;
>                 }
>             }
>             //使用するデータソースをセットする。
>             _dataSourceDict.SetDataSourceName(datasourceNm);
>
>
>         }
>
>
>> 志水さん
>> ご回答ありがとうございます。koalaです。
>>
>>> 私と同じ環境と言っているのでkoalaさんの環境もWEBなのでしょうか?
>>
>> はい。ASP.NETです。
>>
>> ASP.NETでは、Quillはリクエスト一回ごとに(セッション内)で
>> singletonのインスタンスを生成する、であっているのでしょうか?
>>
>> (私はASP.NETどころかWEBも初めてで相当自信ないので)
>> 提案というよりむしろ質問になってしまいますが、
>> こんなやり方ではダメでしょうか?
>>
>>
>>
>>> 同じクラスでもユーザの所属で接続先が変わる仕様
>>
>> ・ログインユーザーのデータソース名を返すDaoSettingを作る
>> ・Daoに上記を設定する
>> ・Injectの前にデータソース名を設定しておく
>>
>> *---
>> ■DaoSetting
>> Public Class UserDaoSetting
>>      Inherits TypicalDaoSetting
>>
>>      Public Overrides ReadOnly Property DataSourceName As String
>>          Get
>>              Return
>> System.Web.HttpContext.Current.Session("DataSourceName")
>>          End Get
>>      End Property
>> End Class
>>
>> ■Dao
>> <Implementation()>
>> <S2Dao(GetType(UserDaoSetting))>
>> <Bean(GetType(TestTable))>
>> Public Interface ITestTableDao
>>      Function SelectAll() As IList(Of TestTable)
>> End Interface
>>
>> ■Page_Load
>>      Protected Sub Page_Load(ByVal sender As Object, ByVal e As
>> System.EventArgs) Handles Me.Load
>>          Session("DataSourceName") = "データソース名"
>>          QuillInjector.GetInstance().Inject(Me)
>> ---*
>>
>> この方法だと、ログイン管理DB用のDaoSettingも作って、Daoで明示的に設定したが良いかも?
>>
>>
>> 以上です。
>> _______________________________________________
>> 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 メーリングリストの案内