Thread-Safety

chironex

Erfahrenes Mitglied
Hallo Leute,

ich habe eine Frage zur Thread-Safety am Beispiel der SqlConnection:

Und zwar habe ich eine Webanwendung, in der eine SqlConnection beim Application_Start erzeugt und in die Applicationauflistung gesteckt wird.

Bei jedem Session_Start wird diese Connection aus der Application geholt und in der Session abgelegt:

Session["SQL_Connection"] = Application["SQL_Connection"]

Jetzt kann es natürlich vorkommen, dass in mehreren Session gleichzeitig Requests kommen und Daten aus der DB (mit der Connection aus der Session) geholt oder geschrieben werden.

Kann diese Vorgehensweise zu Threadproblemen führen? Wenn ja, was wäre eine bessere Variante?

Für Hilfe wäre ich echt dankbar, ich habe einen schleichenden Fehler in meiner Anwendung und ich vermute ihn beim gleichzeitigen Zugriff mehrerer Benutzer.
 

Norbert Eder

Erfahrenes Mitglied
Hier wäre es sinnvoll, beim Erstellen jeder Session ein neues Connection-Objekt anzulegen. Alle Zugriffe mit nur einer Connection auszuführen macht sicherlich Probleme, alleine schon, da du pro Connection (wenn du .NET 1.x verwendest) nur einen DataReader aktiv haben kannst. Liest du also gerade etwas aus der DB aus bzw. iterierst durch den DataReader bekommen alle anderen eine Exception.

Arbeitest du aber z.B. mit OleDB, dann kann dein Application-Objekt ja einen Connection-Pool verwalten (OleDB kann Pooling) und hast somit immer einen Topf mit fertigen Connections die du an die Session weitergeben kannst. Das hat den Vorteil, dass die Erstellung des Connection-Objektes nicht sehr lange dauert, da (sofern noch Connections im Pool vorhanden sind), diese bereits erstellt sind und weitergegeben werden. Du sparst dir also auch noch Zeit -> höhere Performance.
 

chironex

Erfahrenes Mitglied
Stimmt, die Sache mit dem DataReader ist sowieso nicht so ideal.

Wenn ich zum Beispiel ein Frameset öffne, in dem zwei aspx-Seiten mit Datenbankzugriff aufgerufen werden, bekomme ich auch ab und zu die Meldung, dass bereits ein DataReader geöffnet ist, obwohl ich selbst keinen explizit verwende. Ich vermute mal, dass die intern auch in den DataAdaptern Verwendung finden.

Connection Pooling war mir eh ein Begriff, ich hab mich mittlerweile auch ein wenig eingelesen und wenn ich vorher in der MSDN nachgeschaut hätte, hätte ich dort auch die Infos über die Threadsafety der SqlConnection gefunden.

Dort steht, dass die Connection auch static verwendet werden könnte. Wie siehst Du die static Connection im Vergleich zu der Connection pro Session?