2

Fluent NHibernateを使用しています。複数のMSSQLデータベースに同じテーブルが存在する現在、アーカイブされたデータを処理する必要があります。ユーザーが指定したDateの値によっては、別のデータベースに接続する必要がありますが、すべてのマッピング情報は同じままです。同じマップされたテーブルのデータベースの切り替え

、より具体的に:提供日付の値は現在の年以内であれば、そうでない場合は、年間DBを使用して、DB CUR使用(2011年、2010年、2009年、...)。

今度は、SessionFactoryを何度も再作成することは非常に高価なことだと言われていました。そこで、私は自分自身に、既存のsessionFactoryを使用する方法がなければならないと思いました。 (「CUR.DBO」から「2011.DBO」へのスキーマの変更のようなもの)、再接続します。

私はFluentConfigurationとSessionFactoryの両方を台無しにしようとしたが、は、私は、実行時にマッピングをリフレッシュする方法を見つけることができませんでした膝の矢印を取りました。

私は新しいSessionFactoryを作成しますか?または、実行中にNHibernateのマッピングを(Fluent)再初期化する実行可能なプロシージャを知っている人はいますか?

EDIT:非常に重要な点の1つとして、SqlConnectionも外部的に提供されています。これは、すべてのデータベースへのアクセスを提供します。つまり、理論上は、接続を作成する必要はありません。ですから、基本的には、各アーカイブのSessionFactoryを作成して、マッピングのスキーマ情報を更新し、別のデータベースを参照する必要があります。しかし、これは私が立ち往生した場所です。

+1

なぜ2つのセッションファクトリを作成しませんか? 1つはアーカイブデータベース用、もう1つは本番データベース用です。 –

+0

私たちは1年に1つのアーカイブを持っているので、少なくとも10人ほど作成することになります。それは基本的に私の知る限り、私はする必要がありますが、うまくいけば賢い方法があります... –

答えて

1

あなたの回答/コメントありがとうございます。実際に私はセッションファクトリを再利用する方法を見つけていないので、提案されたようにそれらのための参照リストを作成しました。次のソリューションは、私が(データベースの変更)必要なものを、私たちはそれを実行する方法はならない:

private IDictionary<string, ISessionFactory> _sessionFactories; 

    public SqlConnection Connection { get; set; } 

    public ISessionFactory GetSessionFactory(string dbName) 
    { 
     if (_sessionFactories.ContainsKey(dbName)) 
     { 
      return _sessionFactories[dbName]; 
     } 

     FluentConfiguration cfg = Fluently.Configure().Database(MsSqlConfiguration.MsSql2008 
                   .ShowSql() 
                   .ConnectionString(c=>c.Is(Connection.ConnectionString))) 
                 .Mappings(x=>x.FluentMappings.Add<MappedClassMap>()); 
     cfg.ExposeConfiguration(x => x.GetClassMapping(typeof(MappedClass)).Table.Schema = string.Format("{0}.dbo",dbName)); 
     ISessionFactory sf = cfg.BuildSessionFactory(); 
     _sessionFactories.Add(dbName, sf); 
     return sf; 
    } 
1

その後、セッションを作成するセッションファクトリの作成ははるかに高価な操作であることは事実ですので、あなたは確かにデータベースへのすべての単一のクエリのための1つを作成する必要はありません。

しかし、私の経験では、多くても数秒しかかかりません。

ユーザーが別の年を選択するたびに新しいものを作成することをお勧めします。これが起こっている間にあなたに良いフィードバックを与えると(「2010年データベースへの接続」というプログレスバー付きのダイアログなどのダイアログが表示されます)、おそらく待たないでしょう。

そして、あなたは年のための1つを作成したら、彼らは同じ年に多くの問い合わせを行う場合は、それを再利用することができ、したがって、彼らは唯一の照会されている年1回待たなければならないと思います。セッションファクトリの作成に時間がかかりすぎる場合

、私は保存または作成時間を短縮するための構成をキャッシュする方法を説明する投稿を見てきました。しかし、クイックグーグルは良いリンクを立てなかったので、それを研究しなければならないか、別の質問をしなければならないかもしれません。

0

のSessionFactoryが単一のDB用に作成された場合、それはそれの十分です。しかし、Sessionfactoryインスタンスでセッションを開くときに、オーバーロードされたメソッドを使用してDB接続オブジェクトを与えて、DBを切り替えることができます。それを確認して正常に動作しています。

関連する問題