Il parametro init.ora open_cursors
definisce il massimo di cursori aperti che una sessione può avere contemporaneamente. Ha un valore predefinito di 50. Se l'applicazione supera questo numero, viene generato l'errore "ORA-01000:numero massimo di cursori aperti superati".
Pertanto è obbligatorio chiudere le risorse JDBC quando non sono più necessarie, in particolare java.sql.ResultSet e java.sql.Statement. Se non vengono chiusi, l'applicazione ha una perdita di risorse.
In caso di riutilizzo dell'oggetto Connection, è necessario essere consapevoli del fatto che i cursori Oracle aperti vengono mantenuti aperti e in uso finché esiste la connessione e la transazione non è terminata. Quando l'applicazione esegue il commit, i cursori aperti vengono rilasciati.
Pertanto, come progettista di applicazioni è necessario conoscere una stima approssimativa dei cursori aperti necessari per la transazione più complessa.
La difficoltà sta nell'impossibilità delle viste dei parametri interni di Oracle (v$open_cursor, v$sesstat, et. al.) di mostrare la differenza tra i cursori aperti, che sono riutilizzabili e quelli aperti, che sono ancora bloccati (non riutilizzabili!) da un ResulSet o un'istruzione non chiusi. Se chiudi tutti gli oggetti Statement e ResultSet nel tuo blocco finally, la tua applicazione è perfettamente a posto.
La regolazione del parametro init.ora funziona in questo modo (la nostra applicazione necessita di un massimo di 800 cursori)
ALTER SYSTEM SET open_cursors = 800 SCOPE=BOTH;