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