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