sql >> Databáze >  >> RDS >> Oracle

Zavření ResultSet, ale neuzavření PreparedStatement

Únik bude největším problémem s otevřeným kurzorem.

ORA-01000: maximum open cursors exceeded

Pokud je překročen maximální počet otevřených kurzorů, databáze se stane nepoužitelnou s výjimkou kurzorů, které jsou již zadrženy. Ve většině případů, kdy k tomu dojde, se však držené kurzory ani nepoužívají (což by byl případ vaší otázky).

Od verze Java 7 je nejlepším způsobem, jak to zvládnout, použít zkus se zdroji . Oba ResultSet a PreparedStatement implementuje AutoCloseable rozhraní, což znamená, že budou zavřeny, když již nebudou potřeba.

Pokud nemáte java 7, musíte to vyřešit v finally blok, ale ujistěte se, že jste před uzavřením ověřili nulové hodnoty, jinak můžete narazit na NPE, pokud nebyl zdroj nikdy inicializován.

Všimněte si, že obrácený postup nezpůsobí žádný problém, protože uzavřením příkazu se automaticky zavře výsledná sada.

Všimněte si, že můžete snadno povolit více kurzorů vaší aplikaci, abyste snížili pravděpodobnost překročení maxima.

ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;

Pokud však narazíte na maximální počet otevřených kurzorů, většinou by to nemělo být řešením, protože by to pouze skrylo skutečný problém.



  1. Volitelné parametry v uložených procedurách Mysql

  2. zkontrolujte platné datum, které je deklarováno ve varchar2

  3. Jak nastavit správné názvy atributů na agregovaný výsledek json s klauzulí GROUP BY?

  4. Jak změním datový typ sloupce tabulky na více než 1 sloupci?