IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

[Oracle] nombre maximum de curseurs ouverts dépassé


Sujet :

JDBC Java

  1. #1
    Membre habitué Avatar de phoebe
    Inscrit en
    Août 2003
    Messages
    289
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 289
    Points : 143
    Points
    143
    Par défaut [Oracle] nombre maximum de curseurs ouverts dépassé
    Tout est dans le titre, et ça vient de ce code ci-dessous mais je ne vois pas où exactement... quelqu'un a une idée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public static MyResultSet execute(Connection c,String sql,Object[] args) throws SQLException {
    	ArrayList<HashMap> result = new ArrayList<HashMap>();
    	try{
    		PreparedStatement ps = perform(c, sql, args);
    		ResultSet rs = ps.getResultSet();
    		ResultSetMetaData rsmd = rs.getMetaData();
    		HashMap<String,String> line;
    		while (rs.next()) {
    			line = new HashMap<String, String>();
    			for (int i=1;i<=rsmd.getColumnCount();i++) line.put(rsmd.getColumnName(i),rs.getString(i));
    			result.add(line);
    		}
    		rsmd = null;
    		rs.close();
    		ps.close();
    	} catch (Throwable t) {}
     
    	MyResultSet mrs = new MyResultSet();
    	mrs.setListe(result);
    	return mrs;
    }
    c'est la méthode que j'appele pour toutes mes requêtes, et lors d' "inserts" massifs mon nombre de curseurs ouverts déborde à priori...

    je précise que le problème ne vient pas de la ligne "PreparedStatement ps = perform(c, sql, args);" j'ai procédé à quelques tests déjà

    ça ne viendrait pas de l'utilisation de ResultSetMetaData ?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Ce n'est peut-être pas directement la cause de ton problème, en tout cas, la fermeture de tes objets rs et ps serait mieux dans un bloc finally pour être exécutée même en cas d'exception arrivant avant.

  3. #3
    Membre habitué Avatar de phoebe
    Inscrit en
    Août 2003
    Messages
    289
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 289
    Points : 143
    Points
    143
    Par défaut
    c'est exactement ça, je venais juste de trouver, vu que j'exécute toutes mes requêtes avec cette méthode, même les "inserts"... le rs était null et donc une exception était levée, j'ai donc ajouté un rs.close() et ps.close dans mon catch

    merci fr1man !

  4. #4
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Comme l'a dit fr1man, préfère le finally : ça t'évite d'avoir 2 fois le code de fermeture des rs/pst. De plus, pense à tester le not null avant de faire le .close !

  5. #5
    Membre habitué Avatar de phoebe
    Inscrit en
    Août 2003
    Messages
    289
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 289
    Points : 143
    Points
    143
    Par défaut
    pour le not null je l'ai fait c'était pour faire court, Ok pour le finally

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Tant mieux.
    En tout cas, je tiens au bloc finally ce qui t'évite de dupliquer les *.close().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    finally {
     if(rs != null)
      rs.close();
     
     if(ps != null)
      ps.close();
    }

  7. #7
    Membre habitué Avatar de phoebe
    Inscrit en
    Août 2003
    Messages
    289
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 289
    Points : 143
    Points
    143
    Par défaut
    oui oui, merci c'est fait

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par fr1man Voir le message
    Tant mieux.
    En tout cas, je tiens au bloc finally ce qui t'évite de dupliquer les *.close().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    finally {
     if(rs != null)
      rs.close();
     
     if(ps != null)
      ps.close();
    }

    Perso, je te conseillerais plutôt d'utiliser un finally par élément, ce qui donnerait une structure du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    	PreparedStatement ps = ...;
    	try {
     
    		ResultSet rs = ps.executeQuery();
    		try {
     
    			while (rs.next()) {
    				...
    			}
     
    		} finally {
    			rs.close();
    		}
     
    	} finally {
    		ps.close();
    	}
    Car il pourrait très bien y avoir un exception dans le premier close(), et dans ce cas là avec ton code le finally ne se termine pas correctement...



    Enfin phoebe, dans ton code il y a ceci qui est une abomination sans nom :
    On ne doit jamais ignorer une exception !!!!!!!!!


    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Doctrine] ORA-0100 nombre maximum de curseurs ouverts dépassé :
    Par Tyra3l dans le forum ORM
    Réponses: 5
    Dernier message: 02/07/2011, 22h50
  2. ORA-01000: nombre maximum de curseurs ouverts dépassé
    Par opensource dans le forum Débuter
    Réponses: 3
    Dernier message: 20/04/2011, 13h30
  3. ORA-01000: nombre maximum de curseurs ouverts dépassé
    Par ouadie99 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 01/09/2008, 10h03
  4. Réponses: 6
    Dernier message: 17/09/2007, 12h50
  5. [Oracle] Nombre maximum de curseurs ouverts atteint
    Par lionheart33806 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/10/2006, 12h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo