Fehlermeldung "Timeout abgelaufen"

17/06/2009 - 11:06 von ChristianH | Report spam
Hi,

ich habe dieses Posting bereits in der C# NG gepostet, habe aber trotz des
Feedbacks Probleme.
Zunàchst das Problem:
In unserer Serverkomponente werden DB Connections aufgemacht. Nach einer
gewissen Laufzeit, d.h. mehreren Zugriffen von Clients hàngt sich der Server
auf und im EventLog finde ich folgende Eintràge:

"Timeout abgelaufen. Das Zeitlimit ist vorm dem Anfordern einer Verbindung
aus dem Pool abgelaufen. Möglicherweise werden alle Verbindungen im Pool
bereits verwendet, und die maximale Poolgröße wurde erreicht."

Die Connection wird in einem Finally-Block geschlossen. Da maximal 5 Threads
gleichzeitig DB Connections öffnen können, verwundert mich dies ein wenig.

Die Ursache ist laut MSDN, dass die maximale Poolgröße erreicht ist, keine
verwendbaren Verbindungen verfügbar sind, die Anforderung in die
Warteschlange gelangt und in einen Timeout làuft => Exception.

Ich würde mit diesem Wissen das Problem wie folgt behandeln:
Beim Anfordern einer Connection die MaxPoolSize mit der Anzahl der aktuell
geöffneten Connections aus dem Pool vergleichen. Wenn die Anzahl knapp unter
der MaxPoolSize liegt würde ich ClearPool aufrufen.

Gibt es ein besseres Vorgehen für mein Problem?
Danke und Grüße
Christian
 

Lesen sie die antworten

#1 Stefan Falz [MVP]
17/06/2009 - 11:22 | Warnen spam
Hallo Christian,

"ChristianH" schrieb:

In unserer Serverkomponente werden DB Connections aufgemacht. Nach einer
gewissen Laufzeit, d.h. mehreren Zugriffen von Clients hà¤ngt sich der Server
auf und im EventLog finde ich folgende Eintrà¤ge:

"Timeout abgelaufen. Das Zeitlimit ist vorm dem Anfordern einer Verbindung
aus dem Pool abgelaufen. Möglicherweise werden alle Verbindungen im Pool
bereits verwendet, und die maximale PoolgröàŸe wurde erreicht."



das kommt oft, wenn man <Connection>.Dispose() nicht verwendet. Alleine das
Schließen per <Connection>.Close() reicht meist nicht aus. Denk auch an die
Commandobjekte (http://msdn.microsoft.com/en-us/lib...spose.aspx),
DataReader, ...

Die Connection wird in einem Finally-Block geschlossen. Da maximal 5 Threads
gleichzeitig DB Connections öffnen können, verwundert mich dies ein wenig.



Schau mal im Datenbankserver nach den offenen Verbindungen, da sollte es dann
weit mehr als nur 5 geben.

Ich wà¼rde mit diesem Wissen das Problem wie folgt behandeln:
Beim Anfordern einer Connection die MaxPoolSize mit der Anzahl der aktuell
geöffneten Connections aus dem Pool vergleichen. Wenn die Anzahl knapp unter
der MaxPoolSize liegt wà¼rde ich ClearPool aufrufen.



Autsch. Den Pool solltest Du besser in Ruhe lassen.

Gibt es ein besseres Vorgehen fà¼r mein Problem?



Ja, siehe oben. Wichtig ist auch (wird bspw. bei Webanwendungen oft vergessen),
dass man globale Connections auch im Fehlerfall (Application_Error) schließen
und "Disposen" sollte.

Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Ähnliche fragen