ASP.NET Zone

Die ASP.NET Community. Alle Antworten rund um Microsoft® Webtechnologien
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe | Impressum | ASP.NET Zone Suchplugin

in
Home Blogs Foren FAQ Communities Fotos Downloads
Werbeanzeige

DB Verbindung schliessen

Letzter Beitrag 04-19-2012, 14:58 von kaktusgruen. 4 Antworten.
Beiträge sortieren: Zurück Weiter
  •  04-19-2012, 12:06 224198

    DB Verbindung schliessen

    Hallo zusammen,

    ich greife von einer ASP Seite via ODBC aus auf eine Oracle DB zu.

    Beim Aufruf der Seite wird die Verbindung initialisiert. Das Objekt zum herstellen der Verbindung wird in einer Session Variable gespeichert.

    Nun meine Frage:

    Wenn der User den Browser schliesst und somit die Session Variable gelöscht wird, wird dann auch automatisch die Verbindung zur DB geschlossen?

    Oder bleibt sie "irgendwie" offen und könnte evt. Probleme machen?

    Gibt es eine Möglichkeit beim schliessen des Browsers auch die Verbindung korrekt zu schliessen?

     

    mdf kaktus

  •  04-19-2012, 12:20 224199 Antwort zu 224198

    AW: DB Verbindung schliessen

    Connections zu Datenbanken immer sofort schließen nachdem sie benutzt wurde, am besten mittels using-statement.
    Der ODBC-Connection-Pool sorgt schon automatisch dafür dass Verbindungen wiederverwertet werden. Es wird nicht die physikalische Verbindung geschlossen oder disposed. Anstattdessen wird mit Close() dem Pool mitgeteilt dass diese Verbindung anderweitig genutzt werden darf.

    Du erreichst also das genaue Gegenteil von dem was Du vermutlich vor hattest:
    • Performanceverlust, da immer wieder neue physikalische Verbindungen hergestellt werden müssen
    • Fehler (früher oder später, z.B. da die maximale Anzahl an gleichzeitgen Verbindungen überschritten wurde)

    http://msdn.microsoft.com/en-us/library/ms254502.aspx

    Das Speichern in der Session sollte also absolut überflüssig sein.


    Gruß

    Stack Overflow profile for Tim at Stack Overflow, Q&A for professional and enthusiast programmers
  •  04-19-2012, 14:02 224202 Antwort zu 224199

    AW: DB Verbindung schliessen

    Hi TiSch,

    das Problem ist, dass ich die Verbindung nicht einfach schliessen kann. Mit der Applikation wird eine Datenbank bearbeitet.
    Die Verbindung muss also für die gesamte Dauer der Session vorhanden sein. Ich will ja nicht ständig eine Verbindung
    aufmachen und diese dann gleich wieder schliessen. Das wäre ein Performanceverlust, da mancham in einer einzigen
    Methode mehrere Statements an die DB abgesetzt werden. Vielleicht sollte ich noch erwähnen, dass die Session Variable
    global im ganzen Projekt verfügbar ist. So habe ich nur eine einzige Verbindung zur DB pro User für die gesamte Dauer
    seiner Session.

    Nun muss ich also dafür sorgen, dass die Verbindung erst geschlossen wird, wenn der Browser geschlossen wird.
    Mit einem Schliessen-Button ist dies natürlich einfach zu realisieren. Was aber, wenn der User einfach den Browser
    schliesst?
    Was passiert dann genau? Das verstehe ich nicht.

    Wie ich dem Link entnommen habe, wird die Verbindung aber wohl nach einem Time Out automatisch wieder geschlossen.
    The connection pooler removes a connection from the pool after it has been idle for an extended period of time...

    Gibt es keine möglichkeit, diese Verbindung beim schliessen des Browsers sauber zu schliessen?

    Gruss, kaktus

  •  04-19-2012, 14:34 224203 Antwort zu 224202

    AW: DB Verbindung schliessen

    kaktusgruen:
    das Problem ist, dass ich die Verbindung nicht einfach schliessen kann.

    Doch!

    Wie ich bereits schrieb, Connection.Close() oder Conncetion.Dispose() (welches implizit Close aufruft) schließen nicht die physikalische Verbindung. Sie sind nur ein Hinweis für den Connection-Pool dass diese Verbindung(mit diesem ConnectionString) genutzt werden kann. Sollte ein Benutzer Hans Wilhelm nun die Seite aufrufen könnte er diese physikalische Verbindung nutzen. Da Du sie aber nicht geschlossen hast, geht der Conncection-Pool davon aus dass sie nicht genutzt werden kann. Also wird eine neue physikalische Verbindung zur Datenbank hergestellt für Hans Wilhelm(einfach mal hier den ersten Abschnitt lesen warum das zeitaufwendig ist).

    Ich hab hier mal was zu dem Thema geschrieben. Deine Methode wird ganz sicher zu Perfomanceproblemen führen und mit ziemlicher Sicherheit früher oder später die unterschiedlichsten, nicht reproduzierbaren Fehler hervorrufen ;-)

    kaktusgruen:
    ... da manchmal in einer einzigen Methode mehrere Statements an die DB abgesetzt werden.

    Natürlich brauchst Du in einer Methode nicht für jedes statement (SqlCommand etc.) eine eigene Connection erzeugen, aber spätestens am Ende der Methode sollte sie wieder disposed werden (using-statement nutzen!).

    kaktusgruen:
    Vielleicht sollte ich noch erwähnen, dass die Session Variable global im ganzen Projekt verfügbar ist. So habe ich nur eine einzige Verbindung zur DB pro User für die gesamte Dauer seiner Session.

    Der nächste Trugschluss. Im Hintergrund kann der Connection-Pool schon lange dazu gezwungen worden sein 100 physikalische Verbidnungen zu öffnen, spätestens wenn die 100. Session existiert. Und kein UserB könnte die verbindung von UserA benutzen selbst wenn dieser gar nicht mehr mit der Applikation arbeitet. Würde man sie immer sofort "schliessen", könnte eventuell sogar eine physikalische Verbindung für 100 Benutzer reichen da der Pool sie automatisch zuweist.


    Gruß

    Stack Overflow profile for Tim at Stack Overflow, Q&A for professional and enthusiast programmers
  •  04-19-2012, 14:58 224204 Antwort zu 224203

    AW: DB Verbindung schliessen

    Vielen Dank für deine Hilfe.Yes

    Werde mir die ganze Sache später anschauen müssen, da ich momentan keine Zeit habe.

    Gruss, kaktus

Als RSS Feed in XML ansehen
Powered by Community Server (Commercial Edition)