2017-03-13 2 views
0

ich den Code unten haben:ORA-01000: maximal geöffneten Cursor überschritten Fehler

using (System.Data.OracleClient.OracleConnection dataConn = new System.Data.OracleClient.OracleConnection(_connectionString)) 
      { 
       using (System.Data.OracleClient.OracleCommand cmd = new System.Data.OracleClient.OracleCommand()) 
       { 
        cmd.Connection = dataConn; 
        cmd.CommandText = "DELETE FROM Employees WHERE LOCATIONID= :LOCATIONID"; 
        cmd.Parameters.AddWithValue(":LOCATIONID", locationId); 
        dataConn.Open(); 
        retVal += cmd.ExecuteNonQuery(); 
        dataConn.Close(); 
       } 
       using (System.Data.OracleClient.OracleCommand cmd = new System.Data.OracleClient.OracleCommand()) 
       { 
        cmd.Connection = dataConn; 
        cmd.CommandText = string.Format("DELETE FROM Locations WHERE LocationId = :LOCATIONID"; 
        cmd.Parameters.AddWithValue(":LOCATIONID", locationId); 
        dataConn.Open(); 
        retVal += cmd.ExecuteNonQuery(); 
        dataConn.Close(); 
       } 
      } 

Gerade FYI,

  • ich den oben Block sagen in einer Schleife anzurufenden 50 Iterationen.
  • In jeder Iteration übergebe ich eine neue Locationid. -Die erste Abfrage löscht für jede Iteration möglicherweise 500 Datensätze in avg, da ein Standort 500 + Mitarbeitern zugewiesen ist.

Wie pro this Link :, Ich glaube, ich Dinge richtig mache, kann mir jemand bitte zeigen, warum ich immer noch die ORA-01000 erhalten: maximal geöffneten Cursor Fehler überschritten? Jede Hilfe wird sehr geschätzt. Danke.

+0

Fragen Sie Ihren DBA Wert von [OPEN_CURSORS] (http://docs.oracle.com/database/121/REFRN/GUID-FAFD1247-06E5-4E64-917F-AEBD4703CF40.htm#REFRN10137) zu erhöhen. Ich denke, der Standardwert von 50 ist ziemlich niedrig. Vor allem, wie es heißt: * Es gibt keinen zusätzlichen Aufwand, um diesen Wert höher als tatsächlich benötigt zu setzen. * –

Antwort

0

Gemäß der angenommenen Antwort in der Verknüpfung in Ihrem Post (ORA-01000: maximum open cursors exceeded in asp.net), wenn Sie DataConn.Close() aufrufen, wird die Verbindung nicht wirklich geschlossen, aber im Verbindungspool geöffnet bleibt. Dies ist eine versteckte Optimierung, die das Öffnen zusätzlicher Verbindungen beschleunigt, aber bei Überschreitung bestimmter Limits Probleme mit Oracle verursachen kann. Ich schlage vor, Sie untersuchen Möglichkeiten, die Größe des Verbindungspools begrenzt - das hängt davon ab, was Ihren Code hostet (IIS? Etwas anderes?).

Sie könnten auch Ihre SQL zu "DELETE FROM TABLE WHERE Schlüssel IS IN (... Werteliste ...)" ändern. Dadurch müssen 50 logische Verbindungen nicht mehr geöffnet werden (und wer weiß, wie viele physische Verbindungen - möglicherweise viele).

Oder machen Sie die Schleife innerhalb der DataConn.Open ... dataConn.Close - verwenden Sie einfach die gleiche offene Verbindung für alle cmds.

Bearbeiten: Je nachdem, welchen Datenprovider Sie verwenden, kann die Größe des Verbindungspools innerhalb der Verbindungszeichenfolge gesteuert werden. Ein Beispiel finden Sie in https://msdn.microsoft.com/en-us/library/ms254502(v=vs.110).aspx.

+0

Ich benutze IIS, irgendwelche Lichter auf, wie ich es dort untersuchen kann? – user2948533

+0

Bitte sehen Sie meine Bearbeitung. – Polyfun

Verwandte Themen