SQL ServerでNHibernateを使用しているC#でバックエンドを持つASP.Netアプリケーションがあります。SQL ServerでNHibernateタイムアウト
最近私は、Webの特定のページで長い間、いくつかのタスクを実行している間、フリーズし、タイムアウトが発生することに気付きました(NHibernate例外)。
は、タイムアウトの問題の後、私は、SQL Server Management Studioのに行くと私は同じデータベースにどのような状態のないプロセスの数十、すべてのようにありますかモニターで見ることができます:私が持っている
どこからでもソリューションを検索しています。セッションを間違って廃棄しているかどうかはわかりません。
public static void DisposeSession()
{
FlushSession(true); // Method that does a commit if there is a transaction
ISession Session = CurrentSessionContext.Unbind(sessionFactory);
if (Session != null)
{
Session.Close();
Session.Dispose();
}
}
編集1:私は現在、Webフォームを使用していますし、要求の間には、共有セッションがない
、セッションが正しく配置されている。ここでは、私がセッションを配置する方法です。
ウェブのさまざまな部分(新しい要求を実行する)から始めて、プロセスがイメージのように成長し始めて、ある時点でウェブページがランタイムエラーまたはタイムアウト。
この動作を制御するにはどうすればよいですか? リクエストごとに1つのプロセスを持つことができ、処理を終了するときにプロセスを終了することは可能ですか?
編集2:私が間違っていた
は、セッション管理は、右の最初の答えで提供される方法で行われます。プロセスはありますが、NHibernateによって正しく管理されています。
他のコードが何をしても、*静的な* 'DisposeSession'がどこから* unsafely *にセッションを取得しているという事実は、あなたのデータアクセスコードに深刻な問題があることを意味します。 A *セッション*は接続と同じです。可能な限り短時間、 'using()'ブロックで使用するので、何があっても処理され閉じられます。あなたは*共有していません。例外が発生した場合、セッションはとにかく役に立たず、破棄する必要があります。あなたが共有しているものは*工場*です。 –
つまり、この情報を手助けすることはできません。あなたのコードが接続を漏らしている、例外の場合にセッションがリークすることが保証されています。複数の要求が同じセッションを使用しようとするとブロックする*保証*問題はDisposeSessionではありません。あなたはそのようなメソッドを持っていてはいけません。 –
@PanagiotisKanavosあなたは正しいです... "Application_BeginRequest"メソッドでセッションを作成して保存し、静的メソッドを使わずに "Application_EndRequest"でそれを削除することは可能です...可能で安全ですか? – rpfc