3

Linq2Sqlを利用するいくつかのコードを継承しましたが、データコンテキストのインスタンスがプライベートとして定義されたクラスメンバーに格納されていることがわかりました。このクラスは、クラスが作成されるとWebアプリケーション内で使用されるため、データコンテキストのインスタンスが作成され、静的メンバーに割り当てられます。その結果、データコンテキストのインスタンスが作成され、そのクラスのすべてのインスタンスで使用されるようになります。 (したがって、すべてのユーザーにわたって、それ自体が潜在的な問題です)だけでなく、データコンテキストのインスタンスは、Webアプリケーションの期間中(静的クラスメンバーに保持されているため)存在します。

最初に行われた悪い設計上の決定を無視して、ここでの私の質問は、データコンテキストに読み込まれたデータはどうなるのかということです。NHibernateのセッションは、読み取り/作成するオブジェクトへの参照を保持しているため、変更などを追跡できます。セッションはゆっくりと成長し、暗黙的に指示しない限り、クリアされることはありません。Linq2Sqlは同様のことをしますか?したがって、Webアプリケーションが(リサイクルせずに)永遠に存続した場合、このlinq2Sqlコンテキストは、マシンがメモリを使い果たすか、着信要求を満たすことによってデータベース全体を読み取るまで、ゆっくりと成長しますか?コンテキストは通常​​、それ自体から「期限切れ」になるアイテムを削除するキャッシュのようなものではないこと、またはメモリ制限に達したときに最も使用されていないアイテムの削除を開始することは私の理解です。それが何をするのか、私はしません データコンテキストがそれを実行できると思いますか?誰かがこれを経験したことがありますか。私の理解を確認するか、これを防ぐために長期的なデータコンテキストで何ができるかを示すためのリファレンスを提供してください。

4

2 に答える 2

3

はい、プロパティがに設定されてDataContextいる場合、は読み取ったオブジェクトを追跡します。デフォルトで有効になっています。がすでに状態を追跡している場合、の値をfalseに変更することはできません。ObjectTrackingEnabledtrueObjectTrackingEnabledDataContext

ObjectTrackingEnabled変更を加える意図がなく、読み取りを行っているだけの場合はfalseに設定します。falseに設定されているSubmitChanges場合は呼び出すことができません。ObjectTrackingEnabled

それがお役に立てば幸いです。

于 2013-01-09T15:21:54.670 に答える
3

はい、aDataContextはこれまでに関連付けられたすべてのオブジェクトへの参照を保持します。削除されたオブジェクトはキャッシュから削除される可能性がありますが、それ以外の場合は、メモリのコストに関係なく、オブジェクトを保持します。

アーキテクチャとデータセットのサイズによっては、ワーカープロセスは、ある時点でメモリを使い果たしてクラッシュします。唯一の解決策は、オブジェクトトラッキングを無効にするObjectTrackingEnabledか(を介して)、コードをリファクタリングして、DataContextリクエストごとに1つを使用するか、アプリケーション全体を定期的にリサイクルすることです(これはお勧めしません)DataContext

于 2013-02-01T10:19:58.430 に答える