2015-05-13 14 views
7

Ho un'applicazione molto semplice che utilizza EF. Ma quando viene eseguita una settimana, l'utilizzo della memoria è terribile (solo 80 MB in un primo momento, 700 MB dopo una settimana). Quando uso dotMemory per profilare la mia applicazione. Trovo che la memoria della generazione di heap 2 sia in continuo aumento.Perdita di memoria quando si utilizza Entity Framework

only run 40 minutes

ottengo una fotografia istantanea, infine, trovare i byte distribuiti della DbContext ef è la più.

enter image description here

Io sono così confusa. La mia domanda è così semplice. Esempio di codice:

protected CarbonBrushMonitorEntities _entities = new MYEntities(); 
public void Add(HistoryData data) 
{ 
    _entities.HistoryDatas.Add(data); 
    _entities.SaveChanges(); 
} 

_entities solo le iniziali, una volta, al momento di partenza, poi utilizzato per tutto il tempo.

La funzione Add è spesso chiamata, circa 3 volte/secondo

I Google da molto tempo, e provare alcuni metodi come:

_entities.Configuration.ValidateOnSaveEnabled = false; 
_entities.Configuration.AutoDetectChangesEnabled = false; 
_entities.Configuration.LazyLoadingEnabled = false; 

ma questi non funzionano.

+0

Come gestisci la durata del tuo contesto EF? Disponi/ricrearlo mai? – ken2k

+0

@ ken2k crea all'orario di partenza, quindi usato sempre. mai disporre/ricreare. Poiché la mia applicazione Architettura utilizza Ioc e Dipendenza iniezione. – yubaolee

+0

In quale classe si trova il metodo di aggiunta? – lloyd

risposta

15

Se si utilizza Entity Framework, si dovrebbe creare il contesto poco prima ne avete bisogno e smaltire il più presto possibile:

using (var someContext = new SomeContext()) 
{ 
    // your commands/queries 
} 

Mai tenere contesto in memoria o condividerla attraverso diverse chiamate .

Quello che di solito faccio è registrare il contesto di un contenitore CIO:

DependencyFactory.RegisterType(typeof(SomeContext)); 

e utilizzare un risolutore contesto (anche registrato con IOC naturalmente) come:

using (var someContext = _contextResolver.ResolveContext()) 
{ 
    // your commands/queries 
}  

in cui è fatto risoluzione Mi piace:

public class ContextResolver : IContextResolver 
{ 
    public ISomeContext ResolveContext() 
    { 
      return DependencyFactory.Resolve<SomeContext>(); 
    } 
} 

Il contesto EF è in realtà la vostra unità di lavoro, che dovrebbe essere smaltiti una volta che non ne hai più bisogno.

+0

grazie mille – yubaolee

+1

Anche aggiungere che non è thread-safe! e quindi nessuna ragione per tenerlo/condividerlo tra thread. –

+0

@ G.Y: buon punto anche! –

Problemi correlati