Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle non rimuove i cursori dopo aver chiuso il set di risultati

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;