ユニットテストでNHibernateの条件クエリが実行される時間が短くなりますが、Webアプリケーションのコンテキストから実行しようとすると1分以上かかるという問題があります。どちらも同じデータに対して同じデータベースを使用しています。NHibernate:Webアプリケーションでは低速ですが、単体テストでは高速ですが、なぜですか?
私のNHibernateのマッピング:
var properties = new Dictionary<string, string>();
var configuration = new Configuration();
properties.Add("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
properties.Add("proxyfactory.factory_class", "NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate");
properties.Add("connection.release_mode", "on_close");
properties.Add("current_session_context_class", "web");
properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect");
properties.Add("connection.connection_string_name", "DBConnection");
configuration.Properties = properties;
SessionFactory = configuration.BuildSessionFactory();
テストやWebアプリケーションの間のこのマッピングの唯一の違いは、それがテストでthread_staticあるcurrent_session_context_class、ですが、それは問題ではないようです。クエリの
基準:
var reports = Session.CreateCriteria<Report>()
.SetFetchMode("Site", FetchMode.Join)
.SetFetchMode("Actions", FetchMode.Join)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.Add(Subqueries.PropertyIn("Site",
SiteCriteria.GetSitesForUserWithPermission(user, Permission.SomePermission))))
.List<Report>();
私は助けるためにNHプロファイラを使って試してみましたが、それは任意の有用な提案を提供していませんでした。
編集:さらにnhprofilerを見ると、たとえば、テストではクエリの期間は1ms/313ms(データベースのみ/合計)です。 しかし、私のウェブサイトには1ms/43698msかかりました。 NHibernateは実際のオブジェクトをマッピングするのが難しいようです。
Webアプリケーションでセッションを作成する方法は? –
私たちはHttpModuleを持っており、リクエストごとにセッションを作成し、ビルド/ディスポージします。 –