2012-01-28 11 views
1

レガシー・オラクルDBから不変のドメイン・オブジェクトのコレクションを作成するためにnhibernateを使用しています。 Criteria APIを使用した簡単な検索では60秒以上かかる。同じルックアップのその後のルックアップが通常300ミリ秒未満(100ミリ秒でnhibernateで休止する場合)2レベルのキャッシュまたはクエリキャッシュを有効にしないでくださいすべてのクエリはDBに行きますnhibernate prof )。しかし、アプリを数分間放置して再度ルックアップを実行すると、通常は50〜60秒かかりますNHibernateのマッピングが非常に遅い

私はnhibernateプロファイラを使用していますが、私は残りの時間をnhibernateで取らなければならないと思います、なぜ私は理解できませんか?

いくつかの背景情報:私はキー値 ペアに20列をマップする動的な成分を使用しています

  1. 。 iがマッピング

  2. に動的成分を使用していNHibernateの2.1

  3. を使用

  4. 一旦マッピングでiは可変=偽フラグを使用 午前、データが変更されることはありません取得しました。

  5. これはレガシーなので、マッピングでは という複合キーを使用しています。
  6. 私は私が私がFlushMode =決して

  7. を設定しているセッションを開くと、私はまた
  8. (まだ初期のルックアップのパフォーマンスの低下を持っている)ステートレスセッションを試みた各ルックアップで

  9. の周りに50個のオブジェクトをretrivingています私はマッピングでカスタムユーザタイプを定義したり使用したりしないでください

私は明らかに何か間違っているか、何か考えていませんか?

+0

リモートデータベースのように聞こえるでしょうか?最初の接続にはオープンに時間がかかり、その後の接続ではプーリングが利用されますか?コレクションを読み込むために1つのクエリしかかかりませんか? – dotjoe

+0

これで、コレクションをロードするクエリが1つだけになります。私はnhibernate profを使用しています。dbに行くクエリーを1つだけ表示します。また、nhibernate profを表示すると、dbが取る時間は最大300 msです。 – functional

答えて

2

私はそのようなドットトレースとしてC#のパフォーマンスプロファイラのダウンロードをお勧めします。パフォーマンスの問題がどこにあるかをより正確に理解することができます。私はそれがNHibernateマッピングの問題ではないと確信しています。

+0

私はdotTraceを使用しました。そのoracle.DataAccess.Client OracleDataReaderのようです。一部の呼び出しでRead()メソッドが50秒かかる場合でも、実際のdbクエリはわずか300msです。 – functional

+0

NHibernate Profilerだけでなく、SQLプロファイラを使って、クエリが300msしかかからないことを確認しましたか? – cbp

1

Nhibernateの問題ではない可能性が高いです。

  1. 次のコードを使用して、データを取得するまでの時間を確認します。 (db + network_latency + nhibernate_execution)
  2. 関連するAPP関連の遅延がないことを確認したら、クエリプランのキャッシュとクエリの結果キャッシュを調べてデータベースを確認します。クエリーが初めて実行されるときに、キャッシュミスが発生すると、dbは時間のかかる集中的な操作に投資して結果セットを生成します。
  3. 1と2で役立つ情報が得られない場合は、ネットワークを確認してください。たぶんネットワークの圧力によって多大な遅延が発生する可能性があります。
  4. 以下のJeffreyABeckerに記載されているように、セッションファクトリがどのように廃棄/作成されるかを調べます。 ISessionFactory.Dispose()またはconfiguration.BuildSessionFactory()の用途を検索してください。 ISessionFactoryオブジェクトの作成は高価な操作であり、通常はアプリケーションの開始時に作成し、アプリケーションの停止/終了時に破棄する必要があります。 60s>それはまだISessionFactoryのインスタンス化のための健全な番号です。
 
    //Codez
Stopwatch stopwatch = new Stopwatch(); // Begin timing stopwatch.Start(); // Nhibernate specific stuff ONLY in here // Depending on your setup, do a session.Flush(); if possible. // End Timing stopwatch.Stop(); // Write result - console/log4net/diagnostics.debug/etc Console.WriteLine("Time elapsed: {0}",stopwatch.Elapsed);
+0

あなたが提案したように1と2を行いました。 nhibernate profが一貫してdbがボトルネックではないことを示しています。私は.netプロファイラを使用します。 – functional

+0

似たような問題がここに報告されています。https://forums.oracle.com/forums/thread.jspa?threadID=836419 – functional

1

あなたのSessionFactoryのライフタイムはどのように管理されていますか?あなたのSessionFactoryが何らかの非活動期間の後に処分される可能性はありますか?

関連する問題