Mehrere dbcontexts in parallele threads, EntityException "Erneut Ihre Aussage, wenn weniger Benutzer aktiv sind,"
Ich bin mit Parallel.ForEach
zu tun, die Arbeit auf mehrere threads, mit einer neuen EF5 DbContext für jede iteration, alle eingewickelt in ein TransactionScope, wie folgt:
using (var transaction = new TransactionScope())
{
int[] supplierIds;
using (var appContext = new AppContext())
{
supplierIds = appContext.Suppliers.Select(s => s.Id).ToArray();
}
Parallel.ForEach(
supplierIds,
supplierId =>
{
using (var appContext = new AppContext())
{
Do some work...
appContext.SaveChanges();
}
});
transaction.Complete();
}
Nach der Ausführung für ein paar Minuten, es wirft ein EntityException "Der zugrunde liegende Anbieter konnte nicht auf Öffnen ..." mit der folgenden inneren detail:
"Die Instanz von SQL Server Database Engine (Datenbankmodul kann keine LOCK-Ressource erhalten zu dieser Zeit. Erneut Ihre Aussage, wenn weniger Benutzer aktiv sind. Bitten Sie den Datenbankadministrator, um zu überprüfen, die sperren und Speicher-Konfiguration für dieses Beispiel, oder um zu überprüfen, für lang andauernde Transaktionen."
Weiß jemand was dies verursacht oder wie kann es verhindert werden? Danke.
- Sie sind wahrscheinlich laichen eine Millionen threads, die TPL ist optimiert für kurz -, CPU-gebundene Aufgaben-und nicht CPU-bound-Aufgaben zu verwechseln ("warum gibt es so viel Ersatz-CPU???") in der Laichzeit mehr threads. Verwenden Sie die eingeschränkte Parallelität-scheduler aus der MSDN-Website.
- msdn.microsoft.com/en-us/library/ee789351.aspx
- Ich denke, du hast Recht, es war der Laichzeit Lasten von threads. Die Begrenzung der Grad an Parallelität, wie vorgeschlagen, durch bmdixon das problem gelöst.
- Akzeptierte Antwort geändert 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man auch versuchen Sie, die maximale Anzahl der gleichzeitigen Aufgaben in der
Parallel.ForEach()
Methode mitnew ParallelOptions { MaxDegreeOfParallelism = 8 }
(ersetzen 8 mit dem, was Sie wollen, es zu begrenzen,.Sehen MSDN für mehr details
Parallel.ForEach()
nicht erstellen Sie eineTask
für jedes Element in der Sammlung, es wiederverwendetTask
s. Und wenn SieMaxDegreeOfParallelism
es wird die Anzahl derTask
s verwendet und damit den tatsächlichen Grad der Parallelität.Sollten Sie auch herausfinden, warum Ihre app nimmt so große Mengen von sperren? Sie wickelte eine TransactionScope-um mehrere db-verbindungen. Dies verursacht wahrscheinlich eine verteilte Transaktion, die möglicherweise mit ihm zu tun. Es ist sicherlich verursacht Schlösser nie veröffentlicht, bis zum Schluss. Ändern.
Können Sie nur sperren Grenzen so weit. Es nicht skaliert, um beliebige Mengen von Lieferanten-ids. Sie müssen feststellen, dass die Ursache für die Schlösser, nicht die Symptome mildern.
Sie die maximale Anzahl der sperren von sql server zugelassen - die standardmäßig automatisch eingestellt und richtet sich nach den verfügbaren Arbeitsspeicher.
Können Sie