Mein Code gibt ein Dateihandle nicht frei, auch wenn ich dispose für eine initialisierte OleDbException aufrufe. Gibt es eine Möglichkeit, das Programm explizit zu zwingen, ein Dateihandle freizugeben?
Antworten
Zu viele Anzeigen?Standardmäßig verwenden die .NET-Datenbankverbindungen Bündelung . Aufruf von Close()
y Dispose()
gibt die Verbindung nur wieder in den Pool frei, erzwingt aber nicht deren Schließung. Schließlich wird sie aus dem Pool herausgenommen und tatsächlich geschlossen.
Nach einigen Nachforschungen scheint es zwei Hauptwege zu geben, um sie vorhersehbar zu erreichen:
- Deaktivieren Sie das Pooling in der Verbindungszeichenfolge - versuchen Sie, Folgendes hinzuzufügen
OLE DB Services = -2;
die Ihnen alle Dienste außer Pooling bieten sollte - Versuchen Sie Folgendes zu nutzen
OleDBConnection.ReleaseObjectPool()
Für den letzteren Ansatz müssen Sie möglicherweise mit Timeouts spielen - Auszug aus dem verlinkten MSDN-Artikel:
Beachten Sie, dass der Aufruf der Methode allein die aktiven Verbindungen, die im Pool vorhanden sind, nicht wirklich freigibt.
Bevor der Pool endgültig entsorgt wird, muss Folgendes geschehen:
- Rufen Sie Close auf, um das Verbindungsobjekt an den Pool zurückzugeben.
- Erlauben Sie jedem Verbindungsobjekt, sich aus dem Pool zu entfernen.
- Rufen Sie ReleaseObjectPool auf.
- Aufruf der Garbage Collection.
Ich habe einen Anwendungsfall bei der Arbeit, bei dem eine interne Software mit einem alten, unflexiblen, fehlerhaften und absolut entscheidend proprietäre Software. Es muss eine gemeinsam genutzte MDB-Datenbankdatei so kurz wie möglich öffnen, um das Fenster zu minimieren, in dem die andere Software "Probleme machen" könnte (eine sehr schlechte Sache).
Ich habe vor, die Verbindungszeichenfolge zu verwenden, da es einfacher zu sein scheint, den Abschluss zu garantieren, und meine Software nicht wirklich von dem Pool profitiert.
Ich bin mir nicht sicher, warum Ihr Code nach dem Aufruf von Dispose() kein Handle schließt, da dies im Hintergrund Close() aufruft, aber das Folgende kann Ihnen helfen, den Code so zu schreiben, wie er häufig gesehen wird:
using (OleDbConnection conn = new OleDbConnection(connString))
{
//your stuff here
conn.Close(); //not necessary, but doesn't hurt
}
Dadurch wird Ihr Handle geschlossen, unabhängig davon, ob eine Ausnahme ausgelöst wurde oder nicht. Bei Verwendung von Blöcken werden die Ressourcen am Ende des Blocks geschlossen/entsorgt.