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

志水正幸 [E-MAIL ADDRESS DELETED]
2013年 5月 29日 (水) 14:38:07 JST


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