6

NHibernate と複数のデータベース (動的に接続されている) に関する StackOverflow でのいくつかの質問に対して、SessionFactory のキャッシュを (データベースごとに) 保持し、構成へのキャッシュを保持して、SessionFactory をより高速に構築することが最善の解決策であると考えています。

このアプローチが正しいかどうかを知りたいのですが、主に、インスタンスごとのメモリ消費量とビルド時間の観点から、SessionFactory の「重み」はどれくらいですか?

私のアプローチの詳細:

第 1 レベルと第 2 レベルのキャッシュが SessionFactory の「レルム」に存在することがわかっているため、メモリ消費量は開かれた ISession の量 (第 1 キャッシュ レベルを含む) に関連している可能性があると推測できます。

2 番目のキャッシュ レベルでは、データベースが同じスキーマを共有し、共通の読み取り専用テーブルをいくつか持っている私の場合、すべての SessionFactories で読み取り専用テーブルのみを共有するグローバル キャッシュ実装を使用できます。私のプロジェクトにはいいですね。

私は正しいですか?このアプローチでは、どのようなパフォーマンスとメモリの問題が発生する可能性がありますか? 数百 (またはおそらく数千) のデータベースにアクセスする Web アプリケーション (Web フォームではなく ASP.NET MVC) を考えてみましょう。HTTP REQUEST ごとに、ユーザー データベースを見つけて、そのデータベースへのアクセスに対処します (ISession を取得、使用、破棄します)。

接続プール: 接続プールはどうですか? そのアプローチのように、数百または数千のデータベースのプールを管理するには、どのような動作が必要ですか? NHibernate で使用されている現在の実装の一部が役立つか、独自に構築する必要がありますか?

4

1 に答える 1

2

いくつかのテストでは、Configuration と SessionFactory を構築するための時間とリソース (CPU とメモリ) について何人かが言ったことを確認しました。ブースは高価ですが、SessionFactory はもっと、はるかに高価です。しかし、残念ながら、クラスモデルに依存するテストのように、個別のテスト、経験的な結果しかありません。

したがって、私は SessionFactory と Configuration をキャッシュする必要があると信じ続けていますが、Web ソリューションに数百のデータベースがある場合、大きな問題が発生します。SessionFactory はメモリに飢えているためです。これは「メモリ イーター」です。 400 のインスタンスと、数千のデータベースに達すると予想しています。

さて、SQLServer を使用しているので、各データベースに 1 つではなく、各 SQLServer インスタンスに 1 つの SessionFactory を持つようにキャッシュを設計しましたUSE 'catalog-name'。リクエスト。

同じ問題を抱えている他の人が SQLServer からそのようなリソースを探索できることを願っていますが、一部のデータベースでは、データベース (カタログ名) ではなくスキーマ名を使用してそれを行うことができます。

幸運を。

于 2013-03-22T20:18:11.750 に答える