windu.2b Posté(e) le 22 février 2008 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 ?
Sentinel Posté(e) le 23 février 2008 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 : Citation 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 : Citation 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.
windu.2b Posté(e) le 29 février 2008 Auteur 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
Sentinel Posté(e) le 29 février 2008 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
windu.2b Posté(e) le 29 février 2008 Auteur 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
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.