Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Bekomme offene Cursoren auf Oracle-DB nicht geschlossen
oli001
myCSharp.de - Member



Dabei seit:
Beiträge: 464

Themenstarter:

Bekomme offene Cursoren auf Oracle-DB nicht geschlossen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
HeikoAdams
myCSharp.de - Member

Avatar #avatar-4083.jpg


Dabei seit:
Beiträge: 62
Herkunft: Coburg

beantworten | zitieren | melden

Nutzt Du in Deinem SQL
CLOSE(cursor)
um den Cursor zu schließen?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von HeikoAdams am .
Wer ordentlichen Code schreibt, lebt entspannter 8)
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16103

beantworten | zitieren | melden

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?
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
oli001
myCSharp.de - Member



Dabei seit:
Beiträge: 464

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
oli001
myCSharp.de - Member



Dabei seit:
Beiträge: 464

Themenstarter:

beantworten | zitieren | melden

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

Grüße Oli
Viele Grüße, Oli
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10082

beantworten | zitieren | melden

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 ).
private Nachricht | Beiträge des Benutzers
hypersurf
myCSharp.de - Member



Dabei seit:
Beiträge: 520
Herkunft: Münster

beantworten | zitieren | melden

@oli: Im Notfall mal an den DevArt-Support wenden, der ist meiner Erfahrung nach gut und schnell.
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

Hi,

gibt es einen Grund warum Du nicht die OracleConnection benutzt?
Zitat
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von unconnected am .
private Nachricht | Beiträge des Benutzers