Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle ne supprime pas les curseurs après la fermeture du jeu de résultats

Le paramètre init.ora open_cursors définit le nombre maximum de curseurs ouverts qu'une session peut avoir à la fois. Il a une valeur par défaut de 50. Si l'application dépasse ce nombre, l'erreur "ORA-01000 :nombre maximal de curseurs ouverts dépassé" est déclenchée.

Il est donc obligatoire de fermer les ressources JDBC lorsqu'elles ne sont plus nécessaires, en particulier java.sql.ResultSet et java.sql.Statement. S'ils ne sont pas fermés, l'application a une fuite de ressources.

En cas de réutilisation de l'objet Connection, vous devez être conscient du fait que les curseurs oracle ouverts sont maintenus ouverts et utilisés tant que la connexion existe et la transaction n'est pas terminée. Lorsque l'application est validée, les curseurs ouverts sont libérés.

Par conséquent, en tant que concepteur d'application, vous devez connaître une estimation approximative des curseurs ouverts nécessaires pour votre transaction la plus complexe.

La difficulté réside dans l'incapacité des vues de paramètres internes d'Oracle (v$open_cursor, v$sesstat, et. al.) à montrer la différence entre les curseurs ouverts, qui sont réutilisables et les curseurs ouverts, qui sont toujours bloqués (non réutilisables !) par un ResulSet ou un Statement non fermé. Si vous fermez tous les objets Statement et ResultSet dans votre bloc finally, votre application est parfaitement correcte.

Le réglage du paramètre init.ora fonctionne comme ceci (notre application a besoin de 800 curseurs au maximum)

ALTER SYSTEM SET open_cursors = 800 SCOPE=BOTH;