Wie Sie richtig schließen ODP.net Verbindung : dispose () - oder close()?
dies ist mein powershell-code :
[void][System.Reflection.Assembly]::LoadFile("C:\DLL\Oracle.ManagedDataAccess.dll")
$OracleConnexion = New-Object Oracle.ManagedDataAccess.Client.OracleConnection('User Id=test;Password="test";Data Source=10.2.2.1/TEST')
$TimeOut = 60
$OracleConnexion.Open()
$Query=$OracleConnexion.CreateCommand()
$Query.CommandText="Select * FROM TEST"
$Query.CommandTimeout = $Timeout
$ExecuteRequete=$Requete.ExecuteReader()
while ($ExecuteRequete.Read()) {
$SiebelLastRecord += $ExecuteRequete.GetDateTime(0).ToString()
}
$OracleConnexion.Close()
So, ich bin öffnung ODP.NET Verbindung mit $OracleConnexion.open()
dann schließen Sie es mit $OracleConnexion.close()
ist es ausreichend, richtig zu schließen meine Verbindung zur Oracle-Datenbank? Oder sollte ich $OracleConnexion.Dispose()
?
Führe ich mein powershell alle 5min über den Task-scheduler... Also vielleicht Sollte ich die Verwendung von Dispose (), um zu vermeiden, Sättigung Speicher?
- Die beste Vorgehensweise ist, um auch den Aufruf der Dispose () - vor allem, wenn mit ODP.NET nicht verwaltete. Die Argumentation ist, dass der garbage collector kann langsam sein, um aufzuräumen und das kann zu Problemen führen, wie zu viele verbindungen/Cursor offen zu bleiben für zu lange.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie jeder andere, ich bemerkte zu spät, dass Sie in der powershell. In diesem Fall ist es eigentlich egal. Alles wird bereinigt, wenn die shell beendet, unabhängig. Ich nehme an, man könnte hinzufügen, ein [fangen] und vielleicht auch schließen/entsorgen Sie die Verbindung da, wenn es ist noch offen, aber ich denke, dass wäre nur nötig, wenn Sie geplant, auf dass dein Skript weiter.
Ich lasse mein langatmig c# Antwort unten. Auch wenn es nicht wirklich für dein Skript, es erklärt die Unterschiede (oder deren fehlen).
Die kurze Antwort (für c#):
"verwenden" stellt sicher, dass .Dispose aufgerufen wird am Ende des Blocks, auch wenn eine exception geworfen wird. So dass Sie nie Gefahr, eine Verbindung zu Waisen werden, bis die garbage collection bekommt endlich um, um es zu reinigen, und das könnte gut sein, nach dem ausführen von Datenbank-verbindungen.
Die lange Antwort:
Mit einem Reflektor, werden Sie sehen, dass die Dispose-Aufrufe in der Nähe:
Gibt es tatsächlich einen Unterschied? Nein - die nicht verwaltete Ressource IST die Verbindung, die die Sorge mit .Schließen. Würden Sie sehen keinen funktionalen Unterschied (andere als verzögert tracing), wenn Sie überprüft den status der Verbindung in einem finally-block und rief .Schließen Sie es, wenn es noch offen war.
Sagte, dass die empfohlenen Muster für idisposible Objekte ist die Verwendung von "using" block. Ja, ich nehme an, es ist wahr, dass Sie die option haben, öffnen Sie erneut die Verbindung mit nahe, aber ich sehe nicht, dass eine nützliche Sache zu tun.
Wenn Sie nicht verwenden Sie eine using-oder eine endlich und eine exception geworfen wird und schließen/entsorgen nie aufgerufen wird, dann befreien Sie die Verbindung zu der db wäre nicht deterministisch - Dispose(false) passieren würde, wenn der garbage collector dazu gekommen - und das könnte lange, nachdem Sie verbindungen zu Ihrem db.
Schließen schließt die Verbindung und ermöglicht Ihnen, öffnen Sie es wieder.
Entsorgen schließt die Verbindung, wenn es noch nicht geschlossen worden ist und verfügt auch über ihn, so dass Sie nicht öffnen Sie es wieder.
Verwendung von dispose - entsorgen Sie Arbeitsspeicher freigeben einer Ressource,
wenn die Ressource geöffnet ist, dann ein gut benommen .dispose-Methode wird in der Nähe der Ressource.
Mehr standard-Implementierung für die Ressource, die für die Einführung
IDisposable
ist durch das einwickeln von es vonusing
:Es ist äquivalent zu der Umsetzung
.Dispose
nach der Ausführung blockieren. InternDispose
behandelt auch die Schließung. Trotzdem könnte man sich auch an den.Close()
nach dem Befehl block.Einen Beispiel in der oracle-Dokumentation, die verwendet
Oracle.DataAccess
fördert die Nutzung vonDispose
zu.Ich würde wickeln Sie Ihre Verbindung durch eine using-Anweisung. Wenn Sie fertig sind mit Ihrem Anschluss dann schließen Sie es, bevor Sie die Halterung. Zu 100% sicher würde ich so etwas tun:
Edit:
Habe ich den
Con.Close()
, weil in der Vergangenheit diedispose
nicht richtig implementiert wurde in der ODP.NET. Die Verbindung wurde offen gehalten. Wir hatten zu zwingen, die Verbindung manuell schließen muss und dass ist der Grund, warum in dem Beispiel, ich geben Sie dieClose
.OracleConnection
erbt vonDbConnection
ImplementierenIDisposable
- Schnittstelle. Die Entsorgung ist wird automatisch aufgerufen.