sql >> Database >  >> RDS >> Oracle

ResultSet sluiten maar PreparedStatement niet sluiten

Het lek is het maximale open-cursorprobleem.

ORA-01000: maximum open cursors exceeded

Als het maximum aantal geopende cursors wordt overschreden, wordt de database onbruikbaar, met uitzondering van de cursors die al worden vastgehouden. Meestal worden de vastgehouden cursors echter niet eens gebruikt (wat het geval zou zijn in uw vraag).

Sinds Java 7 is de beste manier om hiermee om te gaan het gebruik van een probeer met middelen . Beide ResultSet en PreparedStatement implementeert AutoCloseable interface, wat betekent dat ze worden gesloten wanneer ze niet meer nodig zijn.

Als je geen java 7 hebt, moet je dit afhandelen in de finally blok, maar zorg ervoor dat u controleert op null-waarden voordat u sluit, anders kunt u een NPE tegenkomen als de bron nooit is geïnitialiseerd.

Merk op dat het omgekeerde geen probleem zal veroorzaken, aangezien het sluiten van een instructie automatisch de resultatenset zal sluiten.

Houd er rekening mee dat u gemakkelijk meer cursors naar uw toepassing kunt toelaten, zodat u minder kans heeft om het maximum te overschrijden.

ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;

Als u echter maximaal geopende cursors tegenkomt, zou dit meestal geen oplossing moeten zijn, omdat het alleen het echte probleem zou verbergen.



  1. MySQL telt alles buiten de limiet

  2. PostGIS, is het mogelijk om van sommige punten een polygoon te maken

  3. Concat-rijen in Postgres

  4. Kan geen verbinding maken met lokale MySQL-server via socket '/tmp/mysql.sock' (2)