Parametr init.ora open_cursors
określa maksymalną liczbę otwartych kursorów, które sesja może mieć jednocześnie. Ma domyślną wartość 50. Jeśli aplikacja przekroczy tę liczbę, zgłaszany jest błąd „ORA-01000:przekroczono maksymalną liczbę otwartych kursorów”.
Dlatego konieczne jest zamknięcie zasobów JDBC, gdy nie są już potrzebne, w szczególności java.sql.ResultSet i java.sql.Statement. Jeśli nie są zamknięte, aplikacja ma wyciek zasobów.
W przypadku ponownego użycia obiektu Connection należy pamiętać, że otwarte kursory Oracle są otwarte i używane tak długo, jak istnieje połączenie i transakcja się nie zakończyła. Po zatwierdzeniu aplikacji otwarte kursory są zwalniane.
Dlatego jako projektant aplikacji musisz znać przybliżone oszacowanie potrzebnych otwartych kursorów dla najbardziej złożonej transakcji.
Trudność polega na tym, że wewnętrzne widoki parametrów oracle (v$open_cursor, v$sesstat i in.) nie pokazują różnicy między otwartymi kursorami, które są wielokrotnego użytku, a otwartymi, które są nadal blokowane (nie wielokrotnego użytku!) przez niezamknięty zestaw ResulSet lub oświadczenie. Jeśli zamkniesz wszystkie obiekty Statement i ResultSet w swoim bloku końcowym, Twoja aplikacja będzie działać doskonale.
Dostosowanie parametru init.ora działa w ten sposób (nasza aplikacja potrzebuje maksymalnie 800 kursorów)
ALTER SYSTEM SET open_cursors = 800 SCOPE=BOTH;