Forums Neueste Beiträge
 

Best Practise Frage: Datenbank Connection Handling

06/12/2010 - 14:05 von Jan Kornblum | Report spam
Hallo Gruppe,

ich habe mal eine grundlegende Frage, wie Ihr das mit dem Datenbank
Connection Handling in einer Windows Forms Anwendung so macht.

Ich habe bislang immer pro Form eine Connection, die in verschiedenen
jeweiligen Subs / Functions immer geöffnet und nach der Abfrage wieder
geschlossen wird. Was natürlich schlecht ist, wenn die Subs unter
bestimmten Umstànden ineinander greifen, und plötzlich die Connection
geschlossen ist obwohl sie offen sein sollte...

Hatte es auch mal mit einer einzelen Connection für alles getestet, die
immer offen war, was aber gelegentlich zu Fehlern führte, wenn sich der
State in broken o.Ä. geàndert hatte... Daher habe ich zumindest fürs
Logging von Fehlern in die DB immer ne eigene Connection, die immer
explizit geöffnet und danach wieder geschlossen wird. Natürlch nicht
gerade performant...

Im Idealfall sollte man doch mit EINER Connection arbeiten können,
oder? Kann man nicht ein Event der Connection verwenden, das die
Connection automatisch öffnet, falls sie geschlossen / broken / etc.
ist?

Wie macht ihr das so?

Danke und Gruß,

Jan
 

Lesen sie die antworten

#1 Peter Götz
07/12/2010 - 10:08 | Warnen spam
Hallo Jan,

ich habe mal eine grundlegende Frage, wie Ihr das mit dem Datenbank
Connection Handling in einer Windows Forms Anwendung so macht.

Ich habe bislang immer pro Form eine Connection, die in verschiedenen
jeweiligen Subs / Functions immer geöffnet und nach der Abfrage wieder
geschlossen wird. Was natürlich schlecht ist, wenn die Subs unter
bestimmten Umstànden ineinander greifen, und plötzlich die Connection
geschlossen ist obwohl sie offen sein sollte...



Wenn Deine Subs im selben Thread laufen, werden sie der Reihe
nach abgearbeitet und können somit nicht "ineinandergreifen".
Wenn Deine Connections alle auf die selbe Datenbank zeigen,
ist es reine Ressourcenverschwendung, für jede Form ein eigenes
Connectionobjekt zu erstellen. Für die Datenbank ist jedes
Connectionobjekt ein weiterer Benutzer der verwaltet werden muss.

Die Standardeinstellung für .net-Connectionobjekte ist
ConnectionPooling = Ja. Das bedeutet, auch wenn Du eine
Connection schliesst (Close) wird sie tatsàchlich gar nicht
geschlossen, sondern erst mal einfach an den Connectionpool
übergeben und von diesem im Bedarfsfall wieder zurückgeliefert.

Hatte es auch mal mit einer einzelen Connection für alles getestet, die
immer offen war, was aber gelegentlich zu Fehlern führte, wenn sich der
State in broken o.Ä. geàndert hatte...



Da alle DB-Zugriffe ohnehin mit einer "wasserdichten"
Fehlererkennung und Fehlerbehandlung ausgestattet sein
sollten, ist das kein wirkliches Problem.
Auch bei mehreren Connections kann mal die eine oder
andere Verbindung zur DB unterbrochen sein.


Daher habe ich zumindest fürs Logging von Fehlern in die DB immer ne
eigene Connection, die immer explizit geöffnet und danach wieder
geschlossen wird. Natürlch nicht gerade performant...



Ganz besonders beim Arbeiten mit Access-Datenbanken (*.mdb)
im Zusammenspiel mit der Jet-Engine ist ein stàndiges Öffnen
und Schliessen der Connection eher eine vermeidbare Fehler-
quelle. Bei jedem Öffnen muss eine zur *.mdb gehörende *.ldb
neu erstellt werden oder falls schon vorhanden ein Benutzer-
eintrag in diese *.ldb geschrieben werden. Beim Schliessen
der Connection muss dieser Benutzereintrag in der *.ldb wieder
entfernt werden oder falls es der letzte Benutzer war, die gesamte
*.ldb gelöscht werden.
Bei einer *.mdb ist es sinnvoll, das Connectionpooling mit

OLE DB Services = -4

im Connectionstring auszuschalten, die einzige Connection beim
Programmstart zu öffnen und beim Programmende zu schliessen.

Im Idealfall sollte man doch mit EINER Connection arbeiten können, oder?



Ja, genau so isses.

Kann man nicht ein Event der Connection verwenden, das die Connection
automatisch öffnet, falls sie geschlossen / broken / etc. ist?

Wie macht ihr das so?



DB-Zugriffe sollten immer eine umfassende Fehlererkennung und
Fehlerbehandlung haben. Tritt ein solcher Fehler auf, kann geprüft
werden, in welchem Zustand sich die Connection befindet und bei
Bedarf wieder geöffnet werden.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen