sql >> Database >  >> RDS >> Oracle

Oracle verwijdert geen cursors na het sluiten van de resultatenset

De init.ora parameter open_cursors definieert het maximum aantal geopende cursors dat een sessie tegelijk kan hebben. Het heeft een standaardwaarde van 50. Als de toepassing dit aantal overschrijdt, wordt de fout "ORA-01000:maximum open cursors overschreden" weergegeven.

Daarom is het verplicht om de JDBC-resources te sluiten wanneer ze niet langer nodig zijn, met name java.sql.ResultSet en java.sql.Statement. Als ze niet zijn gesloten, heeft de toepassing een bronlek.

Als u het Connection-object opnieuw gebruikt, moet u er rekening mee houden dat de geopende orakelcursors open blijven en in gebruik blijven zolang de verbinding bestaat en de transactie is niet beëindigd. Wanneer de toepassing zich vastlegt, worden de geopende cursors vrijgegeven.

Daarom moet u als applicatieontwerper een ruwe schatting weten van de benodigde open cursors voor uw meest complexe transactie.

De moeilijkheid ligt in het onvermogen van oracle's interne parameterweergaven (v$open_cursor, v$sesstat, et al.) om het verschil te laten zien tussen geopende cursors, die herbruikbaar zijn en geopende cursors, die nog steeds worden geblokkeerd (niet herbruikbaar!) door een niet-gesloten ResulSet of Statement. Als u alle Statement- en ResultSet-objecten in uw definitief blok sluit, is uw toepassing prima in orde.

Het aanpassen van de parameter init.ora werkt als volgt (onze applicatie heeft maximaal 800 cursors nodig)

ALTER SYSTEM SET open_cursors = 800 SCOPE=BOTH;


  1. Bepaal Oracle null ==null

  2. 5 gewoonten voor databasebewaking van succesvolle DBA's

  3. In Oracle AS werkt de alias niet

  4. ROW_NUMBER in SQL – Selecteer Topvoorbeeld in SQL en SQL Server