Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ResultSet schließen, aber PreparedStatement nicht schließen

Das Leck wird das größte Open-Cursor-Problem sein.

ORA-01000: maximum open cursors exceeded

Wenn die maximale Anzahl offener Cursor überschritten wird, wird die Datenbank mit Ausnahme der bereits gehaltenen Cursor unbrauchbar. In den meisten Fällen werden die gehaltenen Cursor jedoch nicht einmal verwendet (was in Ihrer Frage der Fall wäre).

Seit Java 7 ist der beste Weg, dies zu handhaben, die Verwendung eines try mit Ressourcen . Sowohl ResultSet und PreparedStatement implementiert AutoCloseable Schnittstelle, was bedeutet, dass sie geschlossen werden, wenn sie nicht mehr benötigt werden.

Wenn Sie kein Java 7 haben, müssen Sie dies in finally behandeln blockieren, aber vergewissern Sie sich, dass Sie vor dem Schließen auf Nullwerte prüfen, da Sie sonst möglicherweise auf eine NPE stoßen, wenn die Ressource nie initialisiert wurde.

Beachten Sie, dass die Umkehrung kein Problem verursacht, da das Schließen einer Anweisung automatisch die Ergebnismenge schließt.

Beachten Sie, dass Sie problemlos mehr Cursor für Ihre Anwendung zulassen können, um die Wahrscheinlichkeit einer Überschreitung des Maximums zu verringern.

ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;

Wenn Sie jedoch auf maximal geöffnete Cursor stoßen, sollte dies meistens keine Lösung sein, da es nur das eigentliche Problem verbergen würde.