11

NHibernate を多用するアプリケーションがあります。可能性のあるパフォーマンスの問題を特定するために、NHibernate Profiler の使用を開始しました。私の質問は、Query Duration 統計に関連しています。

統計は、データベース期間と合計期間に分類されます。私が読んだことから、数字は非常に近いはずです。ただし、比較的大きな格差が見られ、これらの原因を突き止めようとしています。ここにいくつかのデータがあります

代替テキスト

これらの問題の修正をどこから開始できるかについてのアイデアはありますか?

4

4 に答える 4

6

アプリケーションは log4net を使用していますか? その場合は、log4net の構成を確認し、NHibernate からログに記録するデータの量を減らす必要があります。

私が現在取り組んでいるプロジェクトの例: 60 行/オブジェクトを返すクエリの場合、すべての NHibernate ログ メッセージを DEBUG レベルでファイルに記録すると、NHProf が報告する合計期間が 8 ミリ秒から約 8000 ミリ秒に増加します!

NHibernate の出力を制限するための設定例:

<root>
    <level value="ALL" />
    <appender-ref ref="console" />
    <appender-ref ref="trace" />
</root>

<logger name="NHibernate">
    <level value="WARN" />
</logger>

これで問題が解決しない場合は、dotTrace や ANTS Profiler などのパフォーマンス プロファイリング ツールを使用して、コードの潜在的なボトルネックを特定できます。これにより、/NHibernate のコード内のどのメソッドに多くの時間がかかっているかが明確に示されます。

于 2011-09-15T11:28:57.597 に答える
0

事実はわかりませんが、合計期間には、SQLクエリを構築するすべてのNHibernateオーバーヘッドが追加され、データ取得時に生データでエンティティを構築すると常に想定していました。

エンティティの構築プロセスが非常に遅いのではないでしょうか? エンティティ コンストラクターで大規模な処理を行っていますか? IO 操作、ロギング、追加の DB アクセス、ネットワークの使用状況...

幸運を

于 2011-01-07T19:28:16.997 に答える
0

最初の結果は、実行して DB から結果を取得するのにかかった時間です。2 番目の結果は、NHibernate が対応するエンティティをメモリにロードするのにかかる時間です。

現在、非常に大きなエンティティ (ほぼ 100 列/フィールド) を利用するプロジェクトに取り組んでいます。数千をロードしようとすると、数秒かかります。ただし、sql-query は数ミリ秒でエンティティ ID のリストを返します。ただし、これらの ID を対応するエンティティに実際に読み込むには、エンティティが大きいか複雑なオブジェクトである場合に余分なオーバーヘッドが発生します (上記の投稿を参照)。

生成されたクエリに関するアラートを受け取りますか? NHibernate Profiler の Duration のすぐ隣の列。

よろしく、
マティアス

于 2011-05-18T08:44:50.230 に答える
0

こんにちは、あなたが正しい場所を見ているとは思いません。データベースの継続時間などを調べるべきではありません。dB レベルに達すると、実行で多くのことを行うことはできません。

代わりに、データベースに送信するクエリの数に集中する必要があります。冗長な呼び出しを避けるか、クエリをキャッシュすることで、それらを最小限に抑えることができますか? 関連するプロパティのみを取得していますか、それともオブジェクト全体をメモリにロードしてから処理していますか。

また、どのプラットフォームに取り組んでいるのか、アプリのボトルネックを特定するためのより良いツールを提案できるかもしれません。

それが役立つことを願っています。

于 2011-01-07T18:06:55.893 に答える