3

WCF サービス (ビジネス \ アプリケーション層) で EF4.3.1 を使用しています。既存のデータベースと Fluent Mapping (EntityTypeConfiguraiton) で EF Code First を使用しています。要求ごとに DbContext のインスタンスが作成され、破棄されます。

DbContext を使用する汎用リポジトリがあります。

テスト サーバーで実行したところ、10 人の同時ユーザーでビジネス レイヤー アプリ プールが 30 分ほどでメモリ不足になることがわかりました。IIS ワーカー プロセスのダンプを取得したところ、EF が大量のメモリを消費していることがわかりました。EF によって作成された大きなオブジェクト ヒープに多くのオブジェクトがありました。ヒープ上の DB から取得したデータのオブジェクトを確認できました。DbContext dispose がこれを処理しているかどうかはわかりません。GC の % 時間は非常に高かった (> 16%)。ダンプ ファイルで気付いた 1 つの奇妙な点は、すべてのマッピング ファイルの文字列表現を格納する巨大な文字列オブジェクト (約 87 MB) があったことです。私はこれが非常に奇妙だと感じました、

EF でこのようなメモリ リークの問題が発生した人はいますか? また、EF の使用方法に問題がある場合もお知らせください。詳細が必要な場合はお知らせください。

ありがとうプラサド

編集 AutiFac DI (WCF 統合) を使用して DbContext のインスタンスを挿入します。Dbcontext の有効期間は InstancePerLifeTime (http 要求ごとに 1 つの要求) です。この方法を実装して、1 つの HTTP リクエストですべてのリポジトリ インスタンスで DbContext のインスタンスを共有しました。

データベースにアクセスする方法は // 宣言 IGenericRepository UserRepository {get;set;} // AutoFac を使用したプロパティ注入

// 使い方 var user = UserRepository.FindBy(u => u.userid == "test@test.com");

リポジトリでは明示的なトランザクションを使用していません。

4

1 に答える 1

2

を破棄せずに大量のレコード (数百万) を再帰的にクエリすると、同様の問題が発生しましたDbContext。WCF サービスのステートレスな性質と、'DbContext' を破棄しているため、これはおそらく問題ではありません (各ユーザーが 1 回のメソッド呼び出しで大量のデータをコンテキストに同時にプルしている場合を除きます)。

データベース ロジックの各ブロックが using ステートメントでラップされていることを確認します。これにより、ガベージ コレクターがコンテキスト内のすべてをメモリから削除できるようになります。

例えば:

public void MyWcfMethod()
{
    using(MyDbContext db = new MyDbContext ())
    {
        // All calls to database go here.
    }
}

私の他の唯一の考えは、サービス内の他のライブラリ(オートマッパーなど)がまだ への参照を持っているためDbContext、範囲外になるのを防いでいるということです。

于 2012-10-13T04:46:24.863 に答える