ASP.NET WebアプリケーションでORMとしてCastle ActiveRecordを使用しています。私はSessionPerRequestアプローチを使用していますが、これはうまく動作します。ただし、データベースレベルでエラーが発生した場合(つまり、アイテムを削除するときの制約エラーまたは切り捨てエラー(文字列またはバイナリデータが切り捨てられます))、エラーの後に実行するすべてのクエリでタイムアウトが発生します。これは約10分間起こり、その後すべてが正常に動作します。私は、これが正しく終了していない取引と関係していると思います。私はエラーの後にトランザクションを正しく閉じる方法を見つけることができないので、私は今、効果を最小限に抑えるために探しています。私は、コマンドタイムアウトと接続タイムアウトを小さな数値に設定しようとしましたが、これはうまくいかないようです。誰もがこの問題を解決する方法を知っていますか?データベース例外後のSQLタイムアウト
答えて
限り、私はあなたの状況を理解することができるよう、あなたの問題のための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セッションを作成し、リクエストの終わりにそれ自身のNHiberanteセッションを廃棄するコードをアプリケーションに持たなければなりません。これはNHibernate自体にコード化されておらず、起動できませんどのような構成であれ、自分でコードを作成する必要があります。
挨拶 Juy Juka
- 1. C#でSQL Serverタイムアウト例外とSqlCommandタイムアウト例外を区別する
- 2. タイムアウト例外
- 3. SQLデータベースからエントリを削除した後のNullpointer例外
- 4. Cassandraでタイムアウト例外
- 5. webdriverをタイムアウト例外
- 6. セレンC#タイムアウト例外
- 7. AzureのSQLデータベース関連の例外
- 8. HttpRequestのタイムアウト例外System.Configuration.Install.Installer
- 9. キャッチのOracleタイムアウト例外
- 10. asp.netアプリケーションのタイムアウト例外
- 11. サーバが応答した後のApache HttpClientのタイムアウト例外
- 12. タイムアウト後のキャッチされない例外ChromeのExt.Ajax.request
- 13. SQL Serverのタイムアウト例外はほとんどありません
- 14. Azure spring boot connectionタイムアウト例外
- 15. 電文API RPCタイムアウト例外
- 16. サービスファブリックアプリケーションPackageDeployment操作タイムアウト例外
- 17. Google App Engine Datastoreタイムアウト例外
- 18. Google Maps APIタイムアウト例外
- 19. ロック待機タイムアウトが例外のキャッチ後に超過トランザクションメソッド
- 20. 例外がデータベース
- 21. Firebaseデータベース例外
- 22. CCNet複数のgitリポジトリのタイムアウト例外
- 23. Javaの接続タイムアウトの例外
- 24. MySQLの長いクエリロック・タイムアウト例外
- 25. メッセージなしのセレン・ランダム・タイムアウト例外
- 26. タイムアウトが無限のHttpClientがタイムアウト例外をスローする
- 27. タイムアウト後のデータベースへの自動保存
- 28. SQLデータソース例外
- 29. Hibernate SQL例外
- 30. SQL例外が
それは 'SessionPerRequest'は全く正常に動作していないことは明らかです。データベースから例外を取得すると、セッションは役に立たなくなります。セッションの期間中*トランザクション*を開いておくと、深刻なバグが発生します。リクエストごとのセッションはEJBやSpring、*セッションファクトリ*、* NOT *、データベース接続やトランザクションのような*アプリケーションコンテナ*と呼ばれます。長いトランザクションを開いたままにすると、過剰なロック、ブロック、タイムアウトなどが発生します。 –
BTW NHibernateは決して例外的に安全ではありませんでした。例外が発生した場合、データベース例外だけでなく、NHセッションも無効です。ただし、*データベース*の例外は、トランザクションがロールバックされ、接続がおそらく閉じられたことを意味します。しかし、何があっても、NHセッションは役に立たず、捨てなければならない。必要に応じて* SessionFactory *をキャッシュしますが、必要以上にセッションを開いたままにしないでください。 –