2009-07-21 4 views
0

ich habe Dienst/Anwendung auf MSSQL-Server verbunden ist, und stürzt manchmal schrecklich mit folgenden Stacktrace (?):C# db Anwendung hält, während Tabellen Reinigung Absturz

Uncaught exception: ArgumentOutOfRangeException - Specified argument was out of the range of valid values. 
Parameter name: capacity, thrown at: mscorlib 
Stack Trace: 
    at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument) 
    at System.Collections.Generic.Dictionary`2..ctor(Int32 capacity, IEqualityComparer`1 comparer) 
    at System.Data.ProviderBase.DbConnectionFactory.PruneConnectionPoolGroups(Object state) 
    at System.Threading._TimerCallback.TimerCallback_Context(Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading._TimerCallback.PerformTimerCallback(Object state) 

Nun, in der Tat, ich don‘ t verwenden timer, (und ich bin mir nicht sicher, wo genau der Timer gestartet wird), und ich kann den Grund für diesen Absturz nicht finden. Haben Sie Erfahrung/haben Sie gesehen, warum genau das passiert und wie Sie es vermeiden können (oder es ignorieren?). Die Laufzeit des Service ist für mich entscheidend.

+0

Können Sie Ihre Verbindungszeichenfolge (sanitized, offensichtlich) posten? –

Antwort

2

Bereinigen Sie Ihre Datenbankverbindungen korrekt, d. H. Mit using oder try..finally?

Sehen Sie sich die Zähler in der Leistungsindikatorkategorie '.Net Data Provider für Sql Server' mit perfmon.exe an, während Ihre App läuft, und überprüfen Sie die Anzahl der Verbindungen und Pools, die Sie verwenden. Wenn das weiter wächst, ist es ein gutes Zeichen, dass Sie Verbindungen verlieren, die zu diesem Fehler führen könnten.

+0

Nein, ich bin nicht, ich bin für den gesamten Dienst während der Zeit verbunden. – nothrow

+2

Wahrscheinlich verwenden Sie das Verbindungspooling. In diesem Fall sollten Sie die Verbindung öffnen, Ihre Arbeit erledigen und sie dann schließen, wenn Sie fertig sind. –

0

dieser Timer ist wahrscheinlich ein interner Teil der Verbindungsverwaltung.

Sind Sie sicher, dass Sie nicht wirklich einen Parameter namens Kapazität auf einem der sp haben?

Wenn ja, sind Sie sicher, dass es nie überläuft?