windu.2b Posté(e) le 22 février 2008 Partager Posté(e) le 22 février 2008 Bonsoir à tous, J'ai semble-t-il un "petit" problème lors de l'exécution de requêtes SQL : au bout d'un moment, je me ramasse l'erreur suivante : java.sql.SQLException: ORA-01000: Nombre maximum de curseurs ouverts atteint Pourtant, toutes mes requêtes sont de cette forme : ResultSet result = null; try { // requete SQL exécutée } catch(SQLException e) {} finally { try { if( result != null ) { //System.out.println( result ); result.close(); } } catch ( SQLException e ) { // TODO Auto-generated catch block e.printStackTrace(); } manager.closeStatement(); } Donc je referme bien le ResultSet à chaque fois... Et la dernière ligne sert à refermer le Statement Où se situerait mon problème ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sentinel Posté(e) le 23 février 2008 Partager Posté(e) le 23 février 2008 Peut-être dans le "manager.closeStatement()" ? Mais bon, de toute façon tu fermes manuellement le resultset avant... Selon la doc de resultset : Note: A ResultSet object is automatically closed by the Statement object that generated it when that Statement object is closed, re-executed, or is used to retrieve the next result from a sequence of multiple results. A ResultSet object is also automatically closed when it is garbage collected. Et celle de Statement : When a Statement object is closed, its current ResultSet object, if one exists, is also closed. En tout cas je ne vois pas la faille dans ton code, sauf si ton "manager" lève des exceptions, car lever des exceptions depuis un bloc finally, caymal. Lien vers le commentaire Partager sur d’autres sites More sharing options...
windu.2b Posté(e) le 29 février 2008 Auteur Partager Posté(e) le 29 février 2008 Bon finalement, j'ai repris tous mes finally, j'ai modifié en mettant ceci : finally { try { if( result != null ) { manager.closeStatement(); result.getStatement().close(); result.close(); result = null; } } catch ( SQLException e ) { throw e; } } Pour être sûr (et plus par précaution qu'autre chose car les tests semblaient concluants avant cela), j'ai même foutu des "manager.closeAllStatements()" (méthode que j'ai créé moi-même mais dont le nom me semble suffisamment explicite) à des endroits où je suis sûr que je ne risque rien de tout refermer, et ça a l'air bon... Bref, sujet clos ! Merci Sentinel Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sentinel Posté(e) le 29 février 2008 Partager Posté(e) le 29 février 2008 Non c'est encore pire, il ne faut jamais lever d'exceptions depuis un bloc "finally" ! Ca casse la pile d'appel de la méthode, et tu risques d'avoir des bugs totalement intraçables au runtime... Il vaut mieux loguer les éventuelles exceptions et les "étouffer" plutôt que de les relancer depuis un finally Lien vers le commentaire Partager sur d’autres sites More sharing options...
windu.2b Posté(e) le 29 février 2008 Auteur Partager Posté(e) le 29 février 2008 Ah... bon, ben je regarderai ça dans la semaine alors Parce que l'appli corrigée est déjà repartie au client (mais il va faire de sretours, donc j'esayerai de "corriger" ça en même temps). Merci pour l'info Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.