IIS 6, ASP.NET, SQL 2005 -> Manchmal keine DB Verbindung

27/12/2007 - 13:57 von Lucas Neumann (MCP) | Report spam
Hallo NG!

folgende Problemstellung:
Ich entwickle derzeit mit VS2008 Webdeveloper eine ASP.NET 3.5 Anwendung
welche über

db = New clsDB
db.ConnectDB()

eine Datenbankverbindung aufbaut.

clsDB.ConnectDB() sieht im wesentlichen so aus:

Public Function ConnectDB() As ConnectionState
Try
Dim DBName As String = "blabladb"
' Datenbankverbindung herstellen
CN = New
SqlConnection(ConfigurationManager.ConnectionStrings(DBName).ToString)

CN.Open()

CMD = New SqlCommand()
CMD.CommandTimeout = 60
CMD.CommandType = CommandType.Text
CMD.Connection = CN
Catch
Return CN.State
End Try


Nachdem die Verbindung aufgebaut wurde, gibts ein paar Abfragen, usw.
Die Verbindung und die Abfragen passieren bei jedem Laden der Webseite. Wenn
ich die Webseite nun oft hintereinander lade (z.B. sehr schnelles,
kontinuierliches aktualisieren der Seite) kann irgendwann keine
Datenbankverbindung mehr aufgebaut werden, so lange bis ich den IIS Worker
Process entweder kille oder 1-2 Minuten warte und dann nochmals versuche die
Seite aufzurufen.

Ich habe bereits festgestellt, dass wenn ich die maximale Anzahl der
Arbeitsprozesse im Application Pool erhöhe, z.B. auf 10, dieses Problem nicht
mehr auftritt. Bei einer maximalen Anzahl von 2 jedoch schon noch. Muss ich
nun damit rechnen, dass je mehr Besucher die Website hat, desto höher das
Risiko ist, dass keine DB Verbindung aufgebaut werden kann und ich die
maximale Anzahl der Arbeitsprozesse bei wachsender Besucherzahl stetig
erhöhen muss?

Mir vermittelt dies den Eindruck, als wàre hier irgendwo der Hund drin, als
wàre meine Webanwendung unperformant.

Beim Debuggen aus Visual Studio heraus, kann ich dieses Problem durch
schnelles neu laden der Seite nicht nachstellen

Danke im Voraus!

Viele Grüße
Lucas Neumann
 

Lesen sie die antworten

#1 Thomas Bandt
27/12/2007 - 14:48 | Warnen spam
Lucas Neumann (MCP) schrieb:
clsDB.ConnectDB() sieht im wesentlichen so aus:
...
Mir vermittelt dies den Eindruck, als wàre hier irgendwo der Hund drin, als
wàre meine Webanwendung unperformant.



Allerdings. Mal davon abgesehen dass ich nicht verstehe,
warum du das Command-Objekt erstellst, sehe ich nirgendwo
ein Schließen der Verbindung.

ASP.NET verwendet so genanntes Connection Pooling, d.h.
Datenbankverbindungen werden gecached und können so sehr
performant wiederverwendet werden.

Für dich als Entwickler bedeutet das: Verbindungen immer
sofort nach Gebrauch wieder schließen, und zwar um jeden
Preis.

In der Praxis erreichst du das in C# mittels using:

using(SqlConnection connection = new SqlConnection)
{
}

Das wird dann vom Compiler in ein try-/catch-Statement
umgebaut, mit dem immer Close() aufgerufen wird. In
VB.NET ist es glaube ich àhnlich.

Wenn ich das richtig sehe könnte es das Konzept deiner
Datenbank-Klasse etwas über den Haufen schmeißen, aber
es nützt nichts.

Zusammenfassung: Connection IMMER SOFORT wieder
schließen. Nach jeder Operation, wenn nicht 100%
sicher im Anschluss gleich wieder eine folgt, die
die Verbindung verwendet (z.B. 2 SqlCommands
nacheinander).

Gruß, Thomas [MVP ASP/ASP.NET]
http://www.69grad.de - Beratung, Entwicklung
http://www.dotnetjob.de - .NET-Stellenbörse
http://blog.thomasbandt.de - Thomas goes .NET

Ähnliche fragen