Laden...

Bekomme offene Cursoren auf Oracle-DB nicht geschlossen

Erstellt von oli001 vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.310 Views
O
oli001 Themenstarter:in
449 Beiträge seit 2005
vor 6 Jahren
Bekomme offene Cursoren auf Oracle-DB nicht geschlossen

verwendetes Datenbanksystem: Oracle

Hallo,

ich führe folgenden Code aus:

         
UniConnection connRund = new UniConnection(connectionString);
            connRund.Open();
            UniCommand cmd = new UniCommand(sql, connRund);
            UniDataReader dr = cmd.ExecuteReader();
            string retVal = "0";
            try
            {
                if (dr.Read())
                {
                    retVal = dr.GetValue(0).ToString(); ;
                }
            }
            catch (Exception e)
            {
                string x = null;
                x = e.Message;
            }
            dr.Close();
            dr = null;

            cmd.ExecuteReader(CommandBehavior.CloseConnection);
            cmd.Connection.Close();
            cmd.Connection.Dispose();
            cmd.Connection = null;
            cmd.Parameters.Clear();
            cmd.Dispose();
            cmd = null;

            connRund.Dispose();
            connRund = null;

Bevor ich das Prog starte habe ich auf der Db 0 Cursoren für die Abfrage. Nach Ausfüren des SQL ist es 1.
Normalerweise sollte aber nach dieser Abfrage und dem Schließen aller Reader, Commands und Connections doch auch der Cursor auf der DB gelöscht werden.

Hiermit hole ich mir die Anzahl offener Cursoren:

SELECT count(1) FROM v$open_cursor oc, v$session s WHERE oc.sid = s.sid and machine='XXX' and oc.sql_text = 'XXX'

Kann mir jemand sagen, wie ich auf eine Oracle DB einen Cursor schließen kann? Notfalls auch hart?

Grüße und Danke Oli

Viele Grüße, Oli

62 Beiträge seit 2017
vor 6 Jahren

Nutzt Du in Deinem SQL

CLOSE(cursor)

um den Cursor zu schließen?

Wer ordentlichen Code schreibt, lebt entspannter 8)

16.807 Beiträge seit 2008
vor 6 Jahren

Hat das einen Grund, dass Du den Code so gestaltest, oder ist das auf irgendwelche Versuche zurück zu führen?
Du schließt ein Mal die Connection über den Command und ein mal direkt: wozu?
Wieso nutzt Du keine usings? Der Code macht an vielen Stellen ja sachlich so keinen sinn, weil viel doppelt und dreifach.
Wenn der DevArt Provider korrekt implementiert ist, dann reicht ein Dispose und damit die Verwendung von using().

Aber zum Problem: kann das sein, dass ein Connection Pooling des DevArt Providers hier Dir den Cursor einfach offen lässt?
Mal das Connection Pooling im Connection String deaktiviert?

O
oli001 Themenstarter:in
449 Beiträge seit 2005
vor 6 Jahren

Hallo Heiko,

nein es ist ein select wie z.b. select c1, c2, c3 from table where c4=0

Ich wüsste nicht wie ich da ein close(cursor) verwenden soll?

Grüße Oli

Viele Grüße, Oli

O
oli001 Themenstarter:in
449 Beiträge seit 2005
vor 6 Jahren

Hallo Abt,
nein das Durcheinander ist das Resulat unzähliger Versuche...

Grüße Oli

Viele Grüße, Oli

F
10.010 Beiträge seit 2004
vor 6 Jahren

Du disposed den reader nicht.

Benutze mal using ( kann man auch gleich benutzen, denn nichts ist in der SW Entwicklung so beständig wie das Provisorium ).

H
523 Beiträge seit 2008
vor 6 Jahren

@oli: Im Notfall mal an den DevArt-Support wenden, der ist meiner Erfahrung nach gut und schnell.

849 Beiträge seit 2006
vor 6 Jahren

Hi,

gibt es einen Grund warum Du nicht die OracleConnection benutzt?

If the Devart.Data.Universal.UniConnection goes out of scope, it is not closed. Therefore, you must explicitly close the connection by calling Close.

hört sich für mich erstmal so an, als wenn man diese Connection nur mit bedacht wählen sollte. Und ob hier IDisposable (absichtlich) nicht richtig implementiert ist, ist auch fraglich.

Andererseits ruftst du ja auch explizit close auf.

edit: also Devart.Data.Oracle.OracleConnection