0

データ入力操作を大部分扱っているウェブサイトで次の例外が発生しています。また、関連するデータベースのテーブルにインデックスが定義されています。データベース呼び出しは、を介して行われますSQLHelper。たとえば、などの場合、またはのメソッドが呼び出されSQLHelper.ExecuteNonQuery()ていることはどこにもわかりません。ですから、いろいろなサイトで読んだことがあるので、それでお世話になっているのではないかと思います。また、多くの場所で使用されているように、またはと組み合わせてコードをチェックすることも非常に面倒であり、ビジネスロジックが定義されているクラスがたくさんあります。私が得ている例外は次のとおりです。Close()Dispose()SQLConnectionSQLHelperClose()Dispose()SQLHelper

レコードは更新されませんでしたタイムアウトが期限切れになりました。プールから接続を取得する前にタイムアウト期間が経過しました。これは、プールされたすべての接続が使用されていて、最大プールサイズに達したために発生した可能性があります。

GC.Collect今のところ、私はApplication_EndRequestメソッドを入れてコードをテストしましたがGlobal.asax、今のところすべてが正常に機能しています。しかし、私はそれが同じものを使用することを厳密に推奨されていないことを知っています。

私は@現在立ち往生しているので、どんな助けでも大歓迎です。

4

1 に答える 1

0

SQLHelperのバージョンがわからないが、connection.Close()が呼び出されていない場合は、手動で呼び出して接続が閉じていることを確認する必要があります。ガベージコレクターは接続を閉じません。

編集

また、接続プールについては、.Net自体によってデフォルトで有効になっています。connection.Close()を呼び出すと、アプリケーションとSQL Serverの間の接続が実際に閉じられたわけではなく、その接続が接続プールに戻され、他のユーザーが掴む。しばらくすると、その接続が物理的に閉じられる新しい接続を誰も開かない場合にのみ、connection.Close()を何度も呼び出す必要はありません。代わりに、他のリソースを解放するためにできるだけ早く呼び出す必要があります。使用するスレッド。

詳細については、Microsoftが接続プールについてどのように言っているかを確認してください:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

別の編集 SQLHelperの更新バージョンを見つけるか、SQLHelperを変更してClose()を追加することをお勧めします。GCが接続を閉じるのに役立つことがわかったが、そのように使用するべきではない場合でも、GCはデータベース接続を解放するようには設計されておらず、メモリのみを対象としています。また、GC.Collect()は、ガベージを開始するためにすぐに実行することを保証しません。コレクション。

また、Webアプリケーションをコーディングしているので、並行性を考慮する必要があります。別のスレッドが実行されているときにGC.Collect()を呼び出すと、他のユーザーに対してシステムの速度が低下しますか?

これらの限られたリソース(db接続、TCP / IPポート、ファイル読み取り/書き込みハンドラーなど)をできるだけ早く解放する必要があるのは常識です。接続を使用せずに簡単にコーディングできる簡単な方法を探している場合は、間違った方向に進んでいます。単にコーディングし、その行をどこにも追加しないでください。ただし、少なくともSQLHelperを確認する必要があります。接続を閉じるためのジョブを実行します。

于 2012-10-19T07:22:47.430 に答える