mmofacts.com

Datenbankverbindungen schliessen

gepostet vor 17 Jahre, 4 Monate von GoGCaM
Hallo zusammen
Kurz meine Problembeschreibung: Auf meiner Homepage habe ich verschiedene Seiten, welche jeweils eine Datenbankverbindung (zu MySQL) herstellen. Dies passiert beim Laden der Seite (sprich für eine Seite eine Datenbankverbindung). Beim PageUnload-Event wird die Verbindung wieder geschlossen. So weit, so gut. Nur leider (und logischerweise auch richtig) wird beim Schliessen des Browsers dieses Event nicht aufgerufen. Dadurch bleibt eine Datenbankverbindung offen.
Ist eine solche offene Verbindung schlimm? Ich nehme mal an, dass diese von Zeit zu Zeit sich "selbst" schliesst?
Mein Ziel ist es eben, nicht für jeden Query eine neue Verbindung aufzubauen, sondern nur eine einzige für das ganze Laden der Seite zu brauchen. Könnt ihr das überhaupt empfehlen? Oder macht ihr für jeden Query eine neue Verbindung auf?
Vielen Dank für euere Hilfe
Gruss,
Gogi
PS. Ich arbeite mit ASP.NET (was allerdings nicht wirklich wichtig ist bei meinen Fragen).
gepostet vor 17 Jahre, 4 Monate von Fornax
Original von GoGCaM
PS. Ich arbeite mit ASP.NET (was allerdings nicht wirklich wichtig ist bei meinen Fragen).

Oh doch, das ist wichtig! Ich wollte schon sagen, dass das total unnützig ist, und in PHP normalerweise eine Verbindung pro Seitenaufruf verwendet wird.
Aber in .NET hatte ich auch das Problem, dass ich für jede Abfrage eine neue Verbindung erstellen muss. Weitergekommen bin ich mit dem Problem noch nicht, da ich daran seit 2-3 Monaten nicht gearbeitet hab...
Grundsätzlich ist es (meiner Meinung nach) schwachsinnig, für jede Abfrage eine neue Verbindung zu erstellen. Wenn man aber keine andere Lösung hat, kann man damit testweise arbeiten, aber bei einem öffentlichem/fertigem Projekt saugt das an der Performance.
Ich hoffe, TheUndeadable kann dir hierbei helfen
gepostet vor 17 Jahre, 4 Monate von DrakeL
Hab keine Ahnung von .NET, gleich vorweg ^^.
Aber in PHP mache ich es so, dass am Anfang des Seitenaufbaus eine Verbindung aufgebaut und am Ende wieder geschlossen wird. Hatte damit noch nie Probleme. Daher meine damals 20-30 Statements pro Seite liefen dann über eine Verbindung. Und ob jetzt bei jedem Seitenaufruf eine Verbindung auf und abgebaut wird oder nur einmal pro Benutzer sollte glaub weniger ein Unterschied machen (sollte im ms Bereich liegen, und ein Benutzer ist meist mehr als ein paar ms auf einer Seite ).
Wenn es Möglich ist, die Verbindung eines Benutzers an einen anderen Benutzer weiterzugeben würde ich mit Singleton arbeiten und die Anzahl der Verbindungen in der Hinsicht beschränken, dass beim Aufbau einer Verbindung nicht immer eine neue machst, sondern einfach eine nimmst, die gerade nicht am belegt ist (So machen wir es in unsrer Anwendungssoftware in C++). Nur wenn alle Verbindungen belegt sind, wird eine neue Aufgebaut. So hast nach ner Zeit immer eine Konstante Anzahl von Verbindungen.
gepostet vor 17 Jahre, 4 Monate von GoGCaM
Hehe okay, wusste ich nicht, dass das so wichtig ist.
Ich wollte noch schreiben, dass ich bisher noch keine Probleme mit den offenen Verbindungen gehabt habe. Nur will ich vorbeugen (falls dann mehrere Spieler aktiv sind), und nicht im Nachhinein unschöne Seiteneffekte bekommen.
gepostet vor 17 Jahre, 4 Monate von Nuky
Pro Seitenaufruf eine Verbindung starten ist state-of-the-art.
Ist natürlich ein Overhead, ist aber normalerweise nicht so tragisch, da auf Geschwindigkeit optimiert.
gepostet vor 17 Jahre, 4 Monate von TheUndeadable
> Pro Seitenaufruf eine Verbindung starten ist state-of-the-art.
.Net poolt diese Verbindungen automatisch (je nach Datenbankprovider, aber alle mir bekannten tun dies, es sei denn man schaltet es explizit ab). Dies bedeutet dass Datenbankverbindungen automatisch wiederverwendet werden und bei Bedarf neue Datenbankverbindungen aufgebaut werden.
Daher ist es kein Problem bei jedem Seitenaufruf ein neues Verbindungsobjekt zu erzeugen, da .Net automatisch die alten Datenbankverbindungen nutzt. Sind diese eine Zeit lang inaktiv, so werden diese wieder abgebaut (je nach Implementierung des Datenbankproviders)
Ansonsten würde ich immer folgende Syntax empfehlen:

protected override void OnUnload(EventArgs e)
{
base.OnUnload(e);
m_iDatabase.Dispose();
}
Das Dispose ist wichtig, da .Net ansonsten nicht 'weiß' (bzw erst nach der nächsten GC weiß), dass du diese Datenbankverbindung nicht mehr brauchst. Führst du diese Methode nicht aus, so werden immer mehr Datenbankverbindungen erstellt.
> Ich nehme mal an, dass diese von Zeit zu Zeit sich "selbst" schliesst?
Ja, wenn der GC loslegt oder ASP.Net nach X Stunden die ASP.Net Anwendung 'recyclet'. Darauf sollte man sich aber nie verlassen.
Das OnUnload-Ereignis wird immer geworfen wenn die Seite aus dem Speicher entladen wird. Auch bei Ausnahmen und anderen Schweinereien. Darauf kannst du dich verlassen.
Evtl wären folgende Seite interessant:
msdn2.microsoft.com/de-de/library/ms178473(VS.80).aspx
msdn2.microsoft.com/de-de/library/ms178472(VS.80).aspx
gepostet vor 17 Jahre, 4 Monate von None
Hmmm... schön und gut, aber wenn man bewußt die Verbindung wegwirft, dann schließt man auch automatisch das von dir beschriebene Feature von .NET aus.
Hat hier jemand mal einen Benchmark gemacht?
gepostet vor 17 Jahre, 4 Monate von TheUndeadable
> schön und gut, aber wenn man bewußt die Verbindung wegwirft
Nein, die Datenbankverbindung wird ja nicht geschlossen. Es wird nur dem Provider signalisiert, dass ich sie nicht mehr brauch. Was er damit macht ist mir erstmal egal.
Im Regelfall lässt er sie für eine weitere Anforderung offen. Genau das ist Connection-Pooling (wie es in jeder Programmierumgebung gibt)

Auf diese Diskussion antworten