?
dEUs schrieb:
Und was ist da der Vorteil zu meiner Methode in der die Verbindung nicht 5 Minuten lebt, sondern immer nur so lang wie benötigt?
Was heißt schon so lange wie benötigt? In der Praxis treten Datenbankzugriffe oft sehr gehäuft auf und dann wieder eine Stunde lang nichts. Das automatische Schließen nach einer bestimmten Zeit ist eingebaut, ich habe nichts dafür machen müssen und ich habe es deshalb verwendet und mir nicht den Kopf zerbrochen. Ich denke auch, dass es Performance-mäßig recht ideal ist und wir haben generell eher woanders Performance-Probleme.
Aber jetzt verstehe ich zumindest deinen Anwendungsfall. Wenn du deine Klasse dafür geeignet findest, spricht natürlich nichts dagegen, sie herzunehmen. Das mit dem Pool kam daher, dass ich deinen Anwendungsfall falsch verstanden habe.
Ich setze mit Dispose das delete in C++ gleich. D.h. dein Aufruf nach dem Dispose wäre im Grunde einfach falsch. Ist dem nicht so?
Der Aufruf wäre falsch, ja. Was auch falsch ist, davon auszugehen, dass andere oder man selber alles richtig macht. Dein dispostes Objekt zu benutzen führt zu undefiniertem Verhalten, weil je nach Umstände verschiedene Dinge passieren (alles wird geil gemacht, eine Exception kommt, nichts kommt aber nichts wird gemacht, ...). Undefiniertes Verhalten ist grundsätzlich ein Risiko für die Sicherheit und sowas will man in .Net-Klassen nicht haben. Falscher Index, falscher Parameter, falsche Verwendung zur falschen Zeit, alles abfangen. Die Philosophie ist hier gänzlich anders. Man geht nicht davon aus, dass der Benutzer einer Klasse ein Mensch ohne Fehler ist. Das heißt nicht, dass man falsche Benutzung toleriert. Fatal wäre es zu prüfen, ob die Verbindung noch offen ist und wenn nicht, einfach die Operation nicht ausführen. Das würde nicht zu einer Exception führen, aber würde Fehler verbergen. Deshalb sollte man eine hier ObjectDisposedException werfen, um die falsche Benutzung anzuzeigen und nicht zu tolerieren.
Speziell zum disposen gibt es Guidelines, von denen zwei der wichtigsten du verletzt:
- erlaube, Dispose() mehrmals aufzurufen
- erlaube nicht, ein dispostes Objekt zu verwenden
Andere Bibliotheken, Tools und Programmierer verlassen sich darauf, dass du das Dispose-Pattern korrekt implementierst. Siehe dazu:
http://msdn2.microsoft.com/en-us/library/fs2xkftw.aspx