2017-12-20 52 views
0

ASP.NET WebアプリケーションでORMとしてCastle ActiveRecordを使用しています。私はSessionPerRequestアプローチを使用していますが、これはうまく動作します。ただし、データベースレベルでエラーが発生した場合(つまり、アイテムを削除するときの制約エラーまたは切り捨てエラー(文字列またはバイナリデータが切り捨てられます))、エラーの後に実行するすべてのクエリでタイムアウトが発生します。これは約10分間起こり、その後すべてが正常に動作します。私は、これが正しく終了していない取引と関係していると思います。私はエラーの後にトランザクションを正しく閉じる方法を見つけることができないので、私は今、効果を最小限に抑えるために探しています。私は、コマンドタイムアウトと接続タイムアウトを小さな数値に設定しようとしましたが、これはうまくいかないようです。誰もがこの問題を解決する方法を知っていますか?データベース例外後のSQLタイムアウト

+0

それは 'SessionPerRequest'は全く正常に動作していないことは明らかです。データベースから例外を取得すると、セッションは役に立たなくなります。セッションの期間中*トランザクション*を開いておくと、深刻なバグが発生します。リクエストごとのセッションはEJBやSpring、*セッションファクトリ*、* NOT *、データベース接続やトランザクションのような*アプリケーションコンテナ*と呼ばれます。長いトランザクションを開いたままにすると、過剰なロック、ブロック、タイムアウトなどが発生します。 –

+1

BTW NHibernateは決して例外的に安全ではありませんでした。例外が発生した場合、データベース例外だけでなく、NHセッションも無効です。ただし、*データベース*の例外は、トランザクションがロールバックされ、接続がおそらく閉じられたことを意味します。しかし、何があっても、NHセッションは役に立たず、捨てなければならない。必要に応じて* SessionFactory *をキャッシュしますが、必要以上にセッションを開いたままにしないでください。 –

答えて

0

限り、私はあなたの状況を理解することができるよう、あなたの問題のための2つの可能なソースがあります

1.データベース・サーバの設定 あなたは私たちにあなたが使用しているウィッヒデータベースをtouldしていません、だから私は推測するしかありません。 SQLコマンドがロックを引き起こすと、例外を引き起こした古いコマンドを待つ可能性があり、決して解決しません(別名TimeOut)。トランザクションがログファイルに格納されている場合、ログファイルは物理的にいっぱい(非常にありそうもない)であり、例外を引き起こした古いコマンド(別名TimeOut)が保存されるまで、将来のコマンドを格納することはできません。 upponによると、データベースシステムによっては、エラーの原因が他にもあるかもしれません。途中で簡単にテストすることができます。もしそれがデータベースによって引き起こされているのであれば、SQLコマンドだけで新しいリクエストを開始することもできます。NHibernateはなく、データベースのエキスパートに対応します。それがデータベースベースの構成の問題である場合、どのようにテストするのですか?シンプル。エラーが発生し、管理ツール(たとえば、MS SQL Server Management Studio、Oracle SQL Developerなど)を使用して、ソフトウェアが送信しているのと同じSQLコマンドを送信するだけです。管理ツールのこのコマンドにソフトウェアと同じ問題がある場合は、データベースベースの構成上の問題であり、データベース内でのみ複製して解決できるはずです。管理ツールからのコマンドがタイムアウトなしで解決された場合、問題はソフトウェアのコードまたは構成内にあります。 SessionPerRequestが動作していない

2. はI「は、約10分間起こる」とあなたは10分間(約ラウンド)ソフトウェアを使用していない後、問題が停止したことを意味していることと思います。また、ブラウザからサーバ(IIS)に新しいリクエストを送信し続けても、問題が長く続くことはないと思います。これは、IIS-web-sessionまたはIIS-application-pool(どちらもあなたのソフトウェアで使用される)がタイムアウトになることを意味し、すべての静的変数、すべてのセッション変数、および格納されているすべてのHibernateセッションそこ!この問題を回避するためにSessionPerRequestソリューションを使用する場合は、このためにSessionPerRequest aproachを実装する必要があります。 リクエストの開始時に新しいNHibernateセッションを作成し、リクエストの終わりにそれ自身のNHi​​beranteセッションを廃棄するコードをアプリケーションに持たなければなりません。これはNHibernate自体にコード化されておらず、起動できませんどのような構成であれ、自分でコードを作成する必要があります。

挨拶 Juy Juka

関連する問題