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 も使用する必要があると述べています。これを試しましたが、問題も解決しませんでした。
ここからどこへ行くべきかよくわかりません。願わくば、ここにいる誰かがこの問題を以前に見て解決したことを願っています。