2010-11-19 7 views
3

Windsor konteynerinin ve varlık çerçevesinin birlikte çalışmasında sorun yaşıyorum ve kendimi tanıttığım bir sorundan kaynaklanıyor olabilir ama net sonuç Korkunç bir bellek sızıntısı alıyorum.Bir ASP.NET MVC uygulamasında Entity Framework ve Windsor kullanılırken bellek sızıntısı var

Uygulamamı bir EDMX ve Depoları ve Hizmetleri ile kurdum ve bunlar ve objectcontext, kullandığım windsor yapılandırma dosyasında perwebrequest olarak ayarlandı. Ancak, ANTS bellek profilerindeki bellek kullanımına baktığımda, nesne bağlam önbelleğinin, Dispose'ın çağrıldığını doğrulamasına rağmen önbellekle bir referans olarak tutulduğunu görüyorum.

Her istek daha dinamik proxy'lerin belleğe takılmaya başlıyor. Eğer bir başkası böyle bir turşu elde etmeyi başardı ve ondan kurtulmak için bana tavsiyede bulunabilirse, çok takdir edilecektir.

+7

Kodu göster. Bağlam ömrünü nasıl yönetirsiniz? – jfar

cevap

4

Ben izini ve windsor kap için kernal üzerinde serbest bırakma ayarlarını değiştirerek sorunu çözmek için başardınız: windsor konteyner perwebrequest bileşenlerin atmayın yöntemini çağıran rağmen

_container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy(); 

görünüyor o yine de topladıkları çöplerin toplanmasını engelleyen bir referansa asılır.

Bu durumda nesne ObjectContext türünde bir referans tutuyordu. Ne yazık ki, bu nesnenin bertaraf edilmesine rağmen, bu nesnede önbelleğe alınan tüm dinamik proxy'ler, veritabanımın bir kopyasının (ya da en azından erişmekte olduğum kısımların) bir kopyasının belleğe eklenmesini ve böylece her bir talebin rampa edilmesine neden olduğu anlamına gelmektedir.

2

Büyük olasılıkla nesneleri doğru şekilde atmıyorsunuzdur. "Using" bloklarını kullanmayı deneyin.

Kodu görmeden çok daha fazlasını söyleyemeyiz.

1

Aynı problem vardı. yaptım, ayrıca Windsor 2.1 kullanıyorum ve _container.Release (kontrolör) ekleyerek oldu Ancak

public override void ReleaseController(IController controller) 
    { 
     _container.Release(controller); 

     var disposable = controller as IDisposable; 
     if (disposable != null) 
     { 
      disposable.Dispose(); 
     } 
    } 

:

araştırmadan sonra o benim Kontrolör Fabrikası'nda _container.Release (kontrolör) bir çağrı eksik olduğunu gibiydi Benim için hiçbir şey yapmayın.

V3.1'e güncelleştirildikten sonra işe yarayacak gibi görünüyor.

Bu yardımcı olur umarım.

p.s. ANTS Memory Profiler - cankurtaran!