2011-07-21 13 views
1

ユニットテストで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は実際のオブジェクトをマッピングするのが難しいようです。

+2

Webアプリケーションでセッションを作成する方法は? –

+0

私たちはHttpModuleを持っており、リクエストごとにセッションを作成し、ビルド/ディスポージします。 –

答えて

4

ユニットテストとウェブアプリケーションの違いは、ユニットテストが記録されていないことです。 私たちのlog4net.configに追加:

<filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="WARN" /> 
</filter> 

そして、問題が去っていきました。

それはこのように多くのものを出力した

2011-07-21 13:07:17,479 DEBUG [14] LoadContexts - attempting to locate loading collection entry [CollectionKey[Actions#d6adfe87-a7d4-4821-bb10-4ef76fcf614d]] in any result-set context 
2011-07-21 13:07:17,481 DEBUG [14] LoadContexts - collection [CollectionKey[Actions#d6adfe87-a7d4-4821-bb10-4ef76fcf614d]] not located in load context 
+0

これはまさに私の問題でした。私のようにこの答えを過小評価しないでください!すべてのlog4netロギングをオフにしてみると、劇的な性能向上が見込まれます。

+0

***更新***明らかに正確には私の問題ではなかった:)しかし、スピードアップ。ソリューションのための私の答えを参照してください。 –

0

のVisual Studioデバッガが犯人です!デバッグをオフにして(ctrl + F5)アプリを実行するか、Visual Studioの外から実行してみてください。私はこれをして、私のアプリは単体テストと同じ速さで走った。

これで問題が解決した場合は、すべてのブレークポイントを削除して.suoファイルを削除するなど、VS Debuggerを高速化するためにできることがいくつかあります。詳細情報については、この記事を参照してくださいに役立つかもしれないSlow debugging issue in Visual Studio

他のもの:

  1. は、あなたのように接続しているユーザーの正しい既定のデータベースを設定してみてください。これは、SQL Server自体(SSMSなどを使用)ではなく、configsのいずれかで行います。
  2. app/web config:<log4net debug="false" threshold="off">のように、thresholdプロパティを使用してlog4netログを完全にオフにします。
  3. 休止状態の設定でdefault_schemaを設定します。
  4. 休止状態の設定でshow_sqlをオフにします。
関連する問題