Parametr init.ora open_cursors
definuje maximální počet otevřených kurzorů, které může mít relace najednou. Má výchozí hodnotu 50. Pokud aplikace překročí toto číslo, zobrazí se chyba „ORA-01000:překročeno maximum otevřených kurzorů“.
Proto je povinné zavřít zdroje JDBC, když již nejsou potřeba, zejména java.sql.ResultSet a java.sql.Statement. Pokud nejsou uzavřeny, aplikace má únik prostředků.
V případě opětovného použití objektu Connection si musíte být vědomi skutečnosti, že otevřené kurzory oracle zůstávají otevřené a používané, dokud spojení existuje a transakce neskončila. Když se aplikace potvrdí, otevřené kurzory se uvolní.
Proto jako návrhář aplikací potřebujete znát hrubý odhad potřebných otevřených kurzorů pro vaši nejsložitější transakci.
Potíž spočívá v neschopnosti pohledů na interní parametry oracle (v$open_cursor, v$sesstat, atd.) ukázat rozdíl mezi otevřenými kurzory, které jsou opakovaně použitelné, a otevřenými kurzory, které jsou stále blokovány (nejsou znovu použitelné!) neuzavřenou sadu ResulSet nebo prohlášení. Pokud zavřete všechny objekty Statement a ResultSet v bloku konečně, vaše aplikace je naprosto v pořádku.
Úprava parametru init.ora funguje takto (naše aplikace potřebuje maximálně 800 kurzorů)
ALTER SYSTEM SET open_cursors = 800 SCOPE=BOTH;