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

Fermeture de ResultSet mais pas de PreparedStatement

La fuite sera le problème d'ouverture maximale du curseur.

ORA-01000: maximum open cursors exceeded

Si le nombre maximal de curseurs ouverts est dépassé, la base de données deviendra inutilisable, à l'exception des curseurs déjà retenus. Cependant, la plupart du temps, lorsque cela se produit, les curseurs maintenus ne sont même pas utilisés (ce qui serait le cas dans votre question).

Depuis Java 7, la meilleure façon de gérer cela est d'utiliser un try avec ressources . Les deux ResultSet et PreparedStatement implémente AutoCloseable interface, ce qui signifie qu'ils seront fermés lorsqu'ils ne seront plus nécessaires.

Si vous n'avez pas Java 7, vous devez gérer cela dans le finally bloc, mais assurez-vous de vérifier les valeurs nulles avant de fermer, sinon vous risquez de rencontrer un NPE si la ressource n'a jamais été initialisée.

Notez que l'inverse ne posera aucun problème car la fermeture d'une instruction fermera automatiquement son jeu de résultats.

Notez que vous pouvez facilement autoriser plus de curseurs dans votre application pour réduire le risque de dépasser le maximum.

ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;

Cependant, la plupart du temps, si vous rencontrez des curseurs ouverts au maximum, cela ne devrait pas être une solution car cela ne ferait que masquer le vrai problème.