0

CodePlex で Kigg プロジェクトの設計に基づいて Web サイトを構築しました。

http://kigg.codeplex.com/releases/view/28200

基本的に、コードはリポジトリ パターンを使用し、Linq-To-Sql に基づくリポジトリ実装を使用します。完全なソース コードは、上記のリンクにあります。

このサイトはしばらく稼働しており、ちょうど 1 年ほど前に次のようなエラーが発生し始めました。

  • このコマンドに関連付けられた開いている DataReader が既に存在し、最初に閉じる必要があります。
  • ExecuteNonQuery には、オープンで使用可能な接続が必要です。接続の現在の状態は閉じています。

これらは、私の記憶に基づいて見つけることができる最も近いエラーの例です。これらのエラーは、サイトのトラフィックが回復し始めたときに発生し始めました。頭を壁にぶつけた後、考え出した問題は Linq-To-Sql 内で継承され、同じ接続を使用して単一の Web 要求で複数のコマンドを呼び出す方法であると想定しました。

最終的に、MARS (複数のアクティブな結果セット) を発見し、それをデータ コンテキストの接続文字列に追加すると、魔法のようにすべてのエラーがなくなりました。

さて、約 1 年早送りすると、サイトのトラフィックが大幅に増加しました。毎週、SQL Server で次のようなエラーが表示されます。

現在のコマンドで重大なエラーが発生しました。結果がある場合は、破棄する必要があります

このエラーの直後に、エラー ログに数百から数千の InvalidCastException エラーが記録されます。基本的に、このエラーは、Linq-To-Sql データ コンテキストへの呼び出しごとに表示されます。Web サーバーを再起動して初めて、これらのエラーが解消されます。

私の問題 (InvalidCastException エラーを除く) を説明した Micosoft サポート サイトの投稿を読み、解決策として、MARS を使用する場合は Asncronous Processing=True も使用する必要があると述べています。これを試しましたが、問題も解決しませんでした。

ここからどこへ行くべきかよくわかりません。願わくば、ここにいる誰かがこの問題を以前に見て解決したことを願っています。

4

3 に答える 3

1

同じ問題があります。エラーが発生したら、IIS アプリケーション プールを再起動して修正する必要があります。

マルチスレッド、接続を開いたままにするなど、さまざまなシナリオを試したにもかかわらず、dev でバグを再現できませんでした。

私が持っている可能性のある手掛かりの 1 つは、サーバー イベント ログのエラーの中に、アプリケーション プールの OutOfMemoryException があるということです。おそらく、これが偽の SQL Datareader エラー (他の場所でのメモリ リーク) の根本的な原因です。繰り返しになりますが、これをdevで再現することはできませんでした。

明らかに、64 ビット OS を使用している場合、これはおそらく原因ではありません。

于 2013-05-20T03:37:41.467 に答える
1

そのため、多くのリファクタリングと再設計を行った結果、問題は最初から MARS (Multiple Active Result Sets) 自体にあることがわかりました。正確な理由や何が起こるかはわかりませんが、MARS はどういうわけか結果セットを混乱させ、Web アプリを再起動するまで回復しません。

MARS を削除したところ、エラーが停止しました。

私の記憶が正しければ、LinqToSql を使用して接続/コマンドが既に閉じられ、読み込まれていないオブジェクト グラフにアクセスしようとした問題を解決するために MARS を追加しました。MARS がないと、エラーが発生します。しかし、MARS を追加すると、気にしないように見えました。これは、私たちが何をしているのかを本当に理解していないという本当に良い例であり、これからいくつかの貴重な(そして高価な)教訓を学びました.

これがこれを経験した他の人に役立つことを願っています。

コメントと回答に貢献してくれたすべての人に感謝します。

于 2013-05-25T21:09:21.643 に答える