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 :

Question sur le comportement du ResultSet


Sujet :

JDBC Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut Question sur le comportement du ResultSet
    Bonjour,

    Soit le code suivant provenant su site d'oracle :

    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
    24
    25
    26
    27
    28
    public static void viewTable(Connection con, String dbName)
        throws SQLException {
     
        Statement stmt = null;
        String query =
            "select COF_NAME, SUP_ID, PRICE, " +
            "SALES, TOTAL " +
            "from " + dbName + ".COFFEES";
     
        try {
            stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()) {
                String coffeeName = rs.getString("COF_NAME");
                int supplierID = rs.getInt("SUP_ID");
                float price = rs.getFloat("PRICE");
                int sales = rs.getInt("SALES");
                int total = rs.getInt("TOTAL");
                System.out.println(coffeeName + "\t" + supplierID +
                                   "\t" + price + "\t" + sales +
                                   "\t" + total);
            }
        } catch (SQLException e ) {
            JDBCTutorialUtilities.printSQLException(e);
        } finally {
            if (stmt != null) { stmt.close(); }
        }
    }
    Mes questions :
    1-Pourquoi le ResultSet n'est-il pas fermé à la fin par un rs.close();
    2-Le fait de fermer un ResultSet élimine-t-il l'instance rs de ResultSet précédemment instancié ?


    Merci !
    OS : LinuxMint 20

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par francky74 Voir le message
    1-Pourquoi le ResultSet n'est-il pas fermé à la fin par un rs.close();
    Parce que fermer le Statement ferme aussi le ResultSet courant attaché au Statement. Attention, en revanche, à fermer les ResultSet lorsque tu en crées plusieurs avec le même statement (seul le dernier sera fermé lors de la fermeture du statement).

    Citation Envoyé par francky74 Voir le message
    2-Le fait de fermer un ResultSet élimine-t-il l'instance rs de ResultSet précédemment instancié ?
    rs est un nom de variable, donc éliminer veut dire pour moi "supprimer le scope qui a déclarer la variable" : rien à voir avec l'appel de close donc. Mais si tu te demandes si la fermeture de l'instance de ResultSet référencée par rs supprime de la mémoire cette instance, la réponse est non. Tant que le variable existe (donc tant que le scope dans laquelle elle a été crée existe) et tant que sa valeur n'est pas modifiée, alors l'instance est toujours référencée, et donc existe toujours en mémoire. Et c'est valable pour toutes les autres scopes (variables, objets...) qui pourraient la référencer aussi (il ne suffit donc pas que rs n'existe plus). Dès que plus aucune instance d'objet ne possède de référence, alors l'instance de ResultSet n'est plus manipulable (on a plus sa référence nulle part accessible dans le programme), mais elle est encore en mémoire : seul le garbage collecting l'en supprimera. Le close() libère les ressources annexes en revanche de manière à ce que cette suppression par le garbage collection ne laisse pas trainer en mémoire des ressources techniques (des handles systèmes, des socket, etc...) associée, qui vont stagner tant que l'application ne sera pas arrêter, voire plus longtemps. Cette libération de ressources parmet également de ne pas les maintenir au-delà de leur utilisation réelle (comme une connexion maintenue à une base de données, par exemple, sur un SGBDR au nombre de connexions limitées.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Merci Joël pour cette réponse !

    A vous lire, j'ai l'impression qu'en fait, le ResultSet possède des états !?!
    OS : LinuxMint 20

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il y a forcément un état dans un ResultSet, puisqu'on le parcourt avec un while( resultset.next() ), à chaque consultation, on ne consulte pas forcément le même record, donc un état différent.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Exact
    One point
    OS : LinuxMint 20

Discussions similaires

  1. [Débutant] Questions sur une IA de comportement animal
    Par lkryss dans le forum Intelligence artificielle
    Réponses: 10
    Dernier message: 16/03/2019, 11h56
  2. Question sur comportement méthode "clone"
    Par ctobini dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 14/12/2012, 14h14
  3. Question sur le comportement des threads
    Par Krishna dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 12/01/2009, 21h56
  4. une question sur les includes comportement bizard
    Par e-m.guillaume dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2006, 21h12
  5. question sur le comportement des threads
    Par rose-bonbon dans le forum CORBA
    Réponses: 4
    Dernier message: 27/10/2004, 18h00

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