HOW TO

Ermitteln eines Cursor-Lecks in Oracle

Last Published: February 10, 2024

Beschreibung

In diesem Artikel wird beschrieben, wie Sie feststellen können, welcher Oracle-Cursor bei jeder Ausführung, die zu folgendem Oracle-Fehler führt, nicht geschlossen oder wiederverwendet wird:

"ORA-01000: maximum open cursors exceeded."

Es ist wichtig, feststellen zu können, welcher Cursor ein Leck hat (nicht geschlossen ist), um zu ermitteln, welcher Teil der Anwendung für die Verwaltung des Cursors verantwortlich ist, Oracle, ArcGIS oder der Anwendungsentwickler.

Lösung oder Problemumgehung

Die bereitgestellten Anweisungen veranschaulichen, wie Cursor identifiziert werden, die von einer Anwendung für eine bestimmte Oracle-Sitzung nicht geschlossen oder wiederverwendet werden.

  1. Ermitteln Sie die Sitzung anhand ihres Oracle-Benutzernamens, um den SID-Wert abzurufen. Stellen Sie eine Verbindung mit der Oracle-Instanz als SYS oder SYSTEM oder als Benutzer mit DBA-Berechtigungen mithilfe von SQL*Plus her. Führen Sie die folgende SQL-Anweisung aus, um den SID-Wert der Sitzung abzurufen:
SQL> SELECT sid FROM v$session WHERE username = 'TOM';

SID
----------
135

Der SID-Wert wird im nächsten Schritt verwendet, um die zu untersuchende Sitzung zu ermitteln.

  1. Listen Sie die Adressen der SQL-Anweisung der Sitzung auf, die über mehr als einen aktiven Verweis verfügen. Führen Sie mit dem aus der vorherigen Anweisung ermittelten SID-Wert eine Abfrage der Sicht "v$open_cursor" aus.
SQL> SELECT COUNT(*), address
2 FROM v$open_cursor
3 WHERE sid = 135
4 GROUP BY address HAVING COUNT(address) > 1 ORDER BY COUNT(*);

COUNT(*) ADDRESS
---------- --------
2 35E6083C
2 35B77834
2 35E686B4
3 35F97908

Das Ergebnis listet jeden Cursor, der von der Sitzung mehrmals geöffnet wurde, in absteigender Reihenfolge auf.

  1. Rufen Sie die tatsächliche SQL-Anweisung für jede, in Schritt 2 zurückgegebene Adresse ab. Dies ist möglich, indem die Sicht "v$sql" mit dem Adresswert abgefragt wird.
SQL> SELECT sql_fulltext
2 FROM v$sql
3 WHERE address = '35F97908';

SQL_FULLTEXT
-------------------------------------------------------------------------------
SELECT OBJECTID, SEG_ID, SYMBOL, PIPE_SIZE, SLOPE, US_INV,
DS_INV, ACC_NO, SEW_NO, MATERIAL, SEW_SHAPE, HEIGHT, WIDTH,
INST_YEAR, TV_LAST, DRAIN_AREA, MEAS_REF, SEP_COMB, PUB_PRI,
QUEST, SEG_TYPE, SSAD_LEN, V__43.st_SHAPE$, V__43.st_len$,
V__43.st_points, V__43.st_numpts, V__43.st_entity, V__43.st_minx,
V__43.st_miny, V__43.st_maxx,V__43.st_maxy, V__43.st_area$,
V__43.st_len$, V__43.st_rowid FROM
(SELECT b.OBJECTID, b.SEG_ID, b.SYMBOL, b.PIPE_SIZE, b.SLOPE, b.US_INV,
b.DS_INV, b.ACC_NO, b.SEW_NO, b.MATERIAL, b.SEW_SHAPE,
b.HEIGHT, b.WIDTH, b.INST_YEAR, b.TV_LAST, b.DRAIN_AREA,
b.MEAS_REF, b.SEP_COMB, b.PUB_PRI, b.QUEST, b.SEG_TYPE,
b.SSAD_LEN, 1 st_SHAPE$, b.SHAPE.points as st_points,
b.SHAPE.numpts as st_numpts, b.SHAPE.entity as st_entity, b.SHAPE.minx as st_minx,
b.SHAPE.miny as st_miny, b.SHAPE.maxx as st_maxx, b.SHAPE.maxy as st_maxy,
b.SHAPE.area as st_area$, b.SHAPE.len as
st_len$, b.rowid as st_rowid FROM TOM.sewers b
WHERE SDE.ST_EnvIntersects(b.SHAPE,:1,:2,:3,:4) = 1
AND b.OBJECTID NOT IN (SELECT /*+ HASH_AJ */ SDE_DELETES_ROW_ID
FROM TOM.D43 WHERE DELETED_AT IN (SELECT l.lineage_id
FROM SDE.state_lineages l WHERE l.lineage_name = :lineage_name1 AND l.lineage_id <= :state_id1)
AND SDE_STATE_ID = 0) UNION ALL SELECT a.OBJECTID, a.SEG_ID, a.SYMBOL, a.PIPE_SIZE, a.SLOPE,
a.US_INV, a.DS_INV, a.ACC_NO, a.SEW_NO, a.MATERIAL, a.SEW_SHAPE,
a.HEIGHT, a.WIDTH, a.INST_YEAR, a.TV_LAST, a.DRAIN_AREA,
a.MEAS_REF, a.SEP_COMB, a.PUB_PRI, a.QUEST, a.SEG_TYPE, a.SSAD_LEN, 2
st_SHAPE$ ,a.SHAPE.points as st_points, a.SHAPE.numpts as st_numpts,
a.SHAPE.entity as st_entity, a.SHAPE.minx as st_minx, a.SHAPE.miny as st_miny,
a.SHAPE.maxx as st_maxx, a.SHAPE.maxy as st_maxy, a.SHAPE.area as st_area$,
a.SHAPE.len as st_len$, a.rowid as st_rowid FROM TOM.A43 a, SDE.state_lineages SL
WHERE SDE.ST_EnvIntersects(a.SHAPE,:5,:6,:7,:8) = 1
AND (a.OBJECTID, a.SDE_STATE_ID) NOT IN (SELECT /*+ HASH_AJ */ SDE_DELETES_ROW_ID, SDE_STATE_ID
FROM TOM.D43 WHERE DELETED_AT IN (SELECT l.lineage_id FROM
SDE.state_lineages l WHERE l.lineage_name = :lineage_name2 AND l.lineage_id <= :state_id2)
AND SDE_STATE_ID > 0) AND a.SDE_STATE_ID = SL.lineage_id AND SL.lineage_name
= :lineage_name3 AND SL.lineage_id <= :state_id3) V__43

Das Ergebnis in diesem Szenario ist eine versionierte räumliche Abfrage. Basierend auf der Aktion der Anwendung, möglicherweise angepasste ArcObjects, gibt es drei Verweise auf diese eine SQL-Anweisung. Entweder öffnet die Anwendung drei explizite Verweise, oder die ArcGIS-Anwendung verwendet die ursprüngliche SQL-Anweisung nicht erneut.
Wenn Sie weitere Unterstützung beim Ermitteln der Ursache des Problems benötigen, wenden Sie sich an den technischen Support von Esri.

Artikel-ID: 000010136

Holen Sie sich Unterstützung mit KI

Lösen Sie Ihr Problem schnell mit dem Esri Support AI Chatbot.

Beginnen Sie jetzt mit dem Chatten

Zugehörige Informationen

Weitere Informationen zu diesem Thema erkunden

Unterstützung durch ArcGIS-Experten anfordern

An den technischen Support wenden

Beginnen Sie jetzt mit dem Chatten

Zu Download-Optionen wechseln