問題タブ [nhprof]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
nhibernate - NHibernate、ActiveRecord、トランザクションデータベースのロック、およびコミットがフラッシュされるとき
これはよくある質問ですが、これまでに見つかった説明と観察された動作は多少異なります。
MVCWebサイトで次のnHibernate戦略が必要です。
- リクエストのA
SessionScope
(変更を追跡するため) - インサートのみをラップする
ActiveRecord.TransactonScope
(バッチのロールバック/コミットを有効にするため) - トランザクションの外部にあることを選択します(ロックの範囲を減らすため)
- 挿入の遅延フラッシュ(セッションの終了時に挿入/更新がUoWとして発生するように)
現在、私たちは:
SessionScope
(FlushAction AutoまたはNeverを使用して)から暗黙のトランザクションを取得しないでください- 使用する場合
ActiveRecord.TransactionScope
、遅延フラッシュはなく、含まれている選択も長時間実行されるトランザクションに追いつきます。
古いバージョンのnHibernate(2.0に非常に近いトランクからのもの)があるためかどうか疑問に思います。
期待されるnHibernateの動作を取得できず、パフォーマンスが低下します(NHProfとSqlProfilerを使用してdbロックを監視します)。
nhibernate - NHibernate Linq は暗黙のトランザクションを使用しますか?
ここで入手可能な Ayende の NHibernate Linq バージョン 2.1.2 を使用しており、NHProf を使用してこのメソッドを使用するクエリを検査する場合:
暗黙のトランザクションを使用しているという警告が表示されます。問題は、これをリポジトリで使用してデータベース セッションを抽象化していることですが、必要な Linq クエリを実行できるように IQueryable を返す柔軟性が必要です。を公開せずにトランザクションで明示的にラップする方法はありますSession.Linq<T>()
か、またはこの場合は警告を無視する必要がありますか?
もう少し背景。私は次のような方法を使用しています:
java - Hibernate 用の HProf のセットアップ
Hibernate 用にNhProfをセットアップするにはどうすればよいですか?
nhibernate - クエリの実行に長い時間がかかるNHibernate
これはFluentNHibernateを使用して行われています
1つのテーブルからデータを取得するNHibernateルックアップがあります。生成されたSQLを取得し、クエリアナライザーで実行すると、実行に約18ミリ秒かかります。
NHProfilerを使用すると、このクエリの期間は〜1800msになります-SQLの100倍です!
移入されているオブジェクトには子クラスが含まれていますが、この子はNHibernateの第2レベルのキャッシュからロードされています
返されるデータはページングされます(クエリごとに50)が、私が知る限り、これは何の違いもありません。
また、カウントを実行しています。これも、クエリアナライザで最大4ミリ秒、NHProfilerによると最大1800ミリ秒かかります。
NH Profilerは、クエリの実行時間、またはクラスを取得、マッピング、オブジェクトグラフを作成するための完全な時間を表示していますか?前者の場合、クエリを直接実行するよりもはるかに時間がかかるのはなぜですか?
編集:NHプロファイラーで指定されたクエリ期間の値に関するAyendeによるこの投稿を見つけました:http://ayende.com/Blog/archive/2009/06/28/nh-prof-query-duration.aspx-それは間違いなくです時間がかかっているデータベースのクエリ
nhibernate - Nibernate での読み込みと取得
私の Web アプリケーションのマスター ページは認証を行い、Get
.
この後、ユーザーコントロールまたは他のクラスでユーザーオブジェクトが必要になるたびに、Load
.
通常、nhibernate はキャッシュからオブジェクトをロードするか、呼び出されるたびLoad
に永続的にロードされたオブジェクトを返すことになっています。しかし、これは私の Web アプリケーションが示す動作ではありません。Loadが呼び出されるたびに、 NHprofは常にSQLを表示します。の正しい動作を確認するにはどうすればよいLoad
ですか?
S#arp アーキテクチャフレームワークを使用しています。
nhibernate - NServiceBus を使用すると、NHProf で「複数のスレッドで単一のセッションを使用することはおそらくバグです」というエラーが表示される
データ アクセス操作に NHibernate を使用する NServiceBus ハンドラを実行すると、注意する必要があるかどうかわからないエラーが表示されます。
ハンドラーには、次のようなコードがあります。
このプロセスをプロファイリングすると、次の行が表示されます。
- 分離レベル: Serializable の分散トランザクションに登録されたセッション
- 分離レベルでトランザクションを開始: 未指定
- SELECT ... FROM AccountGroups this_ WHERE this_.ID = 123
- アカウントに挿入...
- トランザクションをコミットする
- トランザクションをコミットする
tx.Commit() を呼び出すと、最初のコミット メッセージがコードによって生成されます。2 番目のコミット メッセージは、ハンドラーの Handle メソッドを終了したときに発生し、NServiceBus によって呼び出されると思います。この commit の 2 回目の呼び出しにより、NHProf で「複数のスレッドで単一のセッションを使用することはおそらくバグです」というアラートが生成されます。
その時点でコミットすることは本当に何もないので、これは問題ではないと思いますが、ここで不適切なことをしていますか? トランザクション内でコードを実行したいのですが、実行するとこのアラートが表示されます。
何か案は?
nhibernate - 単体テストで NHibernate によって実行されたクエリの数をカウントする
コードの一部のユニット/統合テストでは、コードで 2 番目のレベルのキャッシュが正しく使用されていることを確認したいと考えています。
ここでAyendeによって提示されたコードに基づいています:
http://ayende.com/Blog/archive/2006/09/07/MeasuringNHibernatesQueriesPerPage.aspx
まさにそれを行うための簡単なクラスを作成しました。
使用目的:
ただし、Query count には常に 0 が返されます。SQL ステートメントはログに記録されていません。
ただし、Nhibernate Profiler を使用して、テスト ケースでこれを呼び出すと、次のようになります。
NHProf が同様のアプローチを使用して、log4net などを介した分析のために NHibernate からのログ出力をキャプチャすると、QueryCounter が機能し始めます。
nhibernate sql をログに記録するために log4net を正しく構成するために、コードに何かが欠けているようです... Nhibernate から sql ログ出力を取得するために他に何をする必要があるかについて、何かポインタはありますか?
追加情報:
Logging.config:
show_sql: 真
jfneis の応答に基づいて、NHibernate のファクトリ統計のみを使用する、はるかに単純なクラスを作成しました。
統計が有効になると、これはうまく機能します。
nhibernate - NHibernateとのトランザクションをコミットした後のフェイルセーフクリーンアップ(コレクション)警告
NHProfilerを見ると、トランザクションをコミットした後、次の警告が表示されます。
フェイルセーフクリーンアップ(コレクション):NHibernate.Engine.Loading.CollectionLoadContext
私はこれが何であるか、またはこれをどのように解決できるか全くわかりません。誰かが私を助けることができますか?
ありがとう、ジェレ
nhibernate - NHProf を使用したプロファイリング実行間の NHibernate キャッシュのクリア
NHProf を使用して NHibernate アプリケーションのプロファイルを作成しようとしています。さまざまな呼び出しを実行する一連の単体テストがあります。ただし、単体テストを複数回実行すると、NHProf で異なる結果が得られます。
- セッション1 [1]
- セッション 2 [32]
- セッション 3 [32]
- セッション 4 [2]
- セッション5 [2]
単体テストの最後に session.Clear() の呼び出しを試み、ソリューションの再構築を試みました。しかし、基本的にはクエリを微調整して調整したいのですが、NHibernate が実行間でキャッシュしている場合はそれができません。確かに他の人は以前にこれに遭遇したことがあり、私たちは密集しているだけですが、あなたが提供できる助けをいただければ幸いです.
更新OK、それが予想される動作である場合、クエリの最適化をテストするにはどうすればよいですか?
asp.net - ViewModel オブジェクトを ASP.NET MVC ビュー ページに渡すと、NHProf は「このステートメントはビューから実行されました」という警告を生成します。
ViewModel を View ページに渡すサイトの 1 つのページで、NHProf が次の警告を出していることに気付きました。
このステートメントはビューから実行されたため、パフォーマンスが低下したり、動作が不安定になる可能性があります。
次に、このページにリンクします: http://nhprof.com/Learn/Alerts/QueriesFromViews
私の ViewModel は 2 つのプロパティだけで構成されています。
次のように、コントローラ内でこの ViewModel に写真を割り当てます。
My View は明らかにこのタイプを継承し、(オブジェクトを利用する) ヘッダーを出力することを除けば、それぞれのコンテンツをレンダリングSelectedPhoto
するそれぞれをループするだけです。Photos
NHProf は、ビュー内でループしている写真のコレクションを取得する場所として「問題」クエリを示していますが、オフにしてビュー内からそれらのレコードを取得するように明示的に指示していません-合格しましたPhotos
私のViewModelのプロパティ内のそれらのレコード。
ViewModel を渡す必要のない他のページがあり、単純IEnumerable<Photo>
に View に渡し、問題のビューで行ったのとまったく同じようにマークアップをレンダリングします。NHProf は警告を表示しません (あるべきではないため)。 ) そのシナリオで。
おそらく遅延読み込みに関連していると思います。私のコレクションはViewModelの一部であるためPhotos
、ViewModelタイプ内のプロパティをループすると、その時点でそれらのレコードが取得されますか?
ここで何が起こっているのか誰にも分かりませんか?このサイトは完璧に機能していますが、NHProf は、本来すべきではないところから何かを行っていることに気付きます?!