Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle nie usuwa kursorów po zamknięciu zestawu wyników

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. oracle 11g i integracja hibernacji wiosny i jsf

  2. Konwertuj nowy wiersz na XML wewnątrz wyzwalacza Oracle

  3. Funkcja DBTIMEZONE w Oracle

  4. ORA-00904:nieprawidłowy identyfikator

  5. JSON_QUERY() Funkcja w Oracle