2008-12-11 9 views
5

Ich konnte dies noch nirgendwo explizit finden, aber eine Reihe von Beispielen, die ich online gefunden habe, folgen dem, was ich gemacht habe.Schließt ODP.net einen Ref-Cursor, wenn die Verbindung geschlossen wird?

Ich habe eine C# -Klasse, die ODP.net verwendet, um eine Verbindung zu einer Oracle DB herzustellen und eine Prozedur auszuführen, die in einem Paket enthalten ist.

Mein Paket enthält gespeicherte Prozeduren, die einen ref-Cursor-Ausgabeparameter haben. Die ganze Prozedur öffnet den Cursor für eine bestimmte Select-Anweisung.

Wenn ich diese Prozedur direkt auf der Oracle-Datenbank ausführen, dann werde ich schließlich eine maximale Anzahl von offenen Cursorfehler treffen.

Also habe ich mich gefragt, ob ODP.net wirklich diesen Cursor schließt, der in meiner Prozedur geöffnet wurde?

Ich verwende die OracleDataApaper.Fill (DataSet) -Methode.

z.

Ich habe nur Angst, offene Cursor hinten auf der DB ist alles. Wenn jemand Links zu offizieller Dokumentation bereitstellen kann, wäre das großartig!


Updates:

Vielen Dank für die Eingabe. Ich rief an

com.Dispose(); 
conn.Close(); 
conn.Dispose(); 

aber ließ sie aus meinem Beispiel heraus.

Ich fand diesen Forenbeitrag, der besagt, dass die OracleDataAdapter.Fill (Dataset) -Methode den Ref-Cursor freigibt, nachdem die Fill() -Methode ausgeführt wurde.
http://www.frontoracle.com/oracle-archive/140/386140-close-ref-cursor.html

Ich wünsche, die Oracle-Dokumentation deutlicher war allerdings, diesen Prozess zu beschreiben.

Antwort

9

ODP.NET erfordert, dass Sie Dinge aufräumen. So Sie:

  • haben OracleParameter Instanzen zu entsorgen, da sie nicht verwalteten Ressourcen enthalten und Odp.net nicht tun dies
  • haben zu entsorgen OracleCommand Objekte, als auch sie nicht verwalteten Ressourcen enthalten und schließen ein (!) Verbindung schließt diese nicht
  • offene Cursor können nicht ohne eine offene Verbindung leben, obwohl in Odp.net nichts aufgeräumt wird, nachdem eine Verbindung schließt (oder entsorgt wird), so müssen Sie auch diese aufräumen (und vorher die Verbindung schließt natürlich).

I.o.w .: bereinigen, was Sie erstellen.

Es kann sein, dass der OracleDataAdapter dies bereits für Sie tut, aber das ist unklar (und die odp.net-Dokumentation sagt das nicht, also müssen Sie den (unlesbaren) Code mit Reflektor überprüfen, um sicher zu gehen Daumen mit odp.net: Um Speicherlecks zu vermeiden, rufen Sie immer dispose, auf alles in der Reihenfolge: Parameter, Cursor, Befehl, Transaktion, Verbindung

+2

Ich würde hinzufügen OracleDataReader der Liste der Objekte zu entsorgen, wenn Sie verwenden Sie scheint unser Problem der "maximalen offenen Cursor" gelöst zu haben. – Fueled

0

Ich bin mir nicht sicher, ob Sie auf this Artikel gestolpert sind, und es nicht direkt auf Ihre Frage zutreffen, aber es veranschaulicht etwas, was ich gelernt habe, wenn Sie mit ODP.Net arbeiten: im Zweifelsfall immer schließen (Verbindungen) und entsorgen. Jede Methode, die ich schreibe, die eine Instanz von ODP-Verbindungen, Befehlen und/oder Cursorn verwendet, hat eine Endgültige Klausel, die alles ablegt.

Verwandte Themen