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 :

ResultSet et Statement.close()


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 175
    Points : 59
    Points
    59
    Par défaut ResultSet et Statement.close()
    Bonjour,

    Dans une classe java, je boucle 500 fois sur un Statement.executeQuery() qui envoit des select vers une base Oracle. L'ennui est que je dépasse très vite le nombre de cursors ouverts maxi autorisés dans ma base pour une session Oracle( paramètre init.ora MAXI_OPEN_CURSORS : 300 ) car la classe ne fait pas Statement.close() après chaque passage dans la boucle.
    Une solution serait donc de faire un Statement .close() après chaque passage mais on dirait que le close() ferme aussi le ResultSet généré précédemment par le Statement.executeQuery(). Est ce que cela fonctionne comme ça ? Si oui, comment éviter de fermer le ResultSet ?

    En espèrant avoir été clair, merci d'avance

  2. #2
    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 Re: ResultSet et Statement.close()
    Salut,

    Citation Envoyé par marti
    Une solution serait donc de faire un Statement .close() après chaque passage mais on dirait que le close() ferme aussi le ResultSet généré précédemment par le Statement.executeQuery(). Est ce que cela fonctionne comme ça ?
    Oui cela fonctionne bien comme cela.

    Citation Envoyé par marti
    Si oui, comment éviter de fermer le ResultSet ?
    Au contraire tu dois le fermer, sinon ton problème restera le même...

    En général on parcours le ResultSet pour y recopier les informations dans une liste, afin de le réutiliser plus tard...

    Par exemple si TableRow correspond à une classe représentant ta table SQL, tu peux faire le mapping avec quelque chose 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
    18
    19
    20
    21
    22
    23
    	public List<TableRow> getAllRowFromTable(Connection con) throws SQLException {
    		List<TableRow> list = new ArrayList<TableRow>();
    		Statement st = con.createStatement();
    		try {
    			ResultSet rs = st.executeQuery("select * from table");
    			try {
     
    				while (rs.next()) {
    					TableRow row = new TableRow();
    					row.setValue( rs.getString("value") );
    					// pour tous les elements de ta table.
     
    					list.add(row);
    				}
     
    			} finally {
    				rs.close();
    			}
    		} finally {
    			st.close();
    		}
    		return list;
    	}
    A noter que cela sera grandement simplifié par Java 6 et les annotations : Mustang, JDBC 4.0 et les Annotations

    a++

Discussions similaires

  1. renseignement sur ResultSet et Statement
    Par baptwo dans le forum JDBC
    Réponses: 2
    Dernier message: 28/08/2006, 14h30
  2. ResultSet et Statement
    Par marti dans le forum JDBC
    Réponses: 3
    Dernier message: 12/04/2006, 06h46
  3. Réponses: 15
    Dernier message: 20/07/2004, 09h09
  4. Réponses: 5
    Dernier message: 28/04/2004, 15h09
  5. [debutant][bdd] pb avec resultSet is closed
    Par mexong dans le forum JDBC
    Réponses: 5
    Dernier message: 22/03/2004, 16h42

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