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 :

Chute des performances à chaque requête


Sujet :

JDBC Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 29
    Points : 35
    Points
    35
    Par défaut Chute des performances à chaque requête
    Bonjour,

    j'ai un gros problème avec mon appli, je viens de m'appercevoir que chaque nouvelle requête SQL est plus longue que la précédente. J'utilise exclusivement les ResultSet de JDBC pour mes requêtes sur une base de données Access.

    J'ai effectué 3enregistrements consécutifs avec les mêmes données avec un temps d'écart pour être sûr que l'appli a toutes les ressources nécessaires.
    Voici le contenu des requêtes :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    [ UPDATE Utilisateur SET taille = 1.9, nom = 'Ambre', prenom = 'Benedict', dateNaiss = 662511600000, morphotypeId = 3, sexeId = 1 WHERE id =67; ]
    [ SELECT id FROM Semaine WHERE utilisateurId=67; ]
    [ UPDATE Semaine SET poids = 60.0, masseMaigre = 50.0, premierJour = 1195426840576, utilisateurId = 67, objectifId = 3 WHERE id =176; ]
    [ SELECT id FROM Jour WHERE semaineId=176; ]
    [ UPDATE Semaine SET poids = 70.0, masseMaigre = 65.0, premierJour = 1194821943296, utilisateurId = 67, objectifId = 2 WHERE id =177; ]
    [ SELECT id FROM Jour WHERE semaineId=177; ]
    [ UPDATE Jour SET semaineId = 177, nom = 'Dimanche' WHERE id =217; ]
    [ SELECT id FROM Repas WHERE jourId=217; ]
    [ UPDATE Repas SET jourId = 217, heure = 18, nom = 'YUYUYU' WHERE id =267; ]
    [ SELECT id FROM LignesMenus WHERE repasId=267; ]
    [ UPDATE LignesMenus SET repasId = 267, alimentId = 9, quantite = 300 WHERE id =340; ]
    [ UPDATE Jour SET semaineId = 177, nom = 'Jeudi' WHERE id =218; ]
    [ SELECT id FROM Repas WHERE jourId=218; ]
    [ UPDATE Repas SET jourId = 218, heure = 14, nom = 'fhgf' WHERE id =268; ]
    [ SELECT id FROM LignesMenus WHERE repasId=268; ]
    [ UPDATE LignesMenus SET repasId = 268, alimentId = 5, quantite = 34 WHERE id =341; ]
    [ UPDATE Jour SET semaineId = 177, nom = 'Lundi' WHERE id =219; ]
    [ SELECT id FROM Repas WHERE jourId=219; ]
    [ UPDATE Repas SET jourId = 219, heure = 20, nom = 'DFGFDG' WHERE id =269; ]
    [ SELECT id FROM LignesMenus WHERE repasId=269; ]
    [ UPDATE LignesMenus SET repasId = 269, alimentId = 12, quantite = 789 WHERE id =342; ]
    [ UPDATE Repas SET jourId = 219, heure = 12, nom = 'TUTY' WHERE id =270; ]
    [ SELECT id FROM LignesMenus WHERE repasId=270; ]
    [ UPDATE LignesMenus SET repasId = 270, alimentId = 13, quantite = 200 WHERE id =343; ]
    [ UPDATE Jour SET semaineId = 177, nom = 'Mardi' WHERE id =220; ]
    [ SELECT id FROM Repas WHERE jourId=220; ]
    [ UPDATE Repas SET jourId = 220, heure = 10, nom = 'oiu' WHERE id =271; ]
    [ SELECT id FROM LignesMenus WHERE repasId=271; ]
    [ UPDATE LignesMenus SET repasId = 271, alimentId = 13, quantite = 200 WHERE id =344; ]
    [ UPDATE Repas SET jourId = 220, heure = 8, nom = 'oioi' WHERE id =272; ]
    [ SELECT id FROM LignesMenus WHERE repasId=272; ]
    [ UPDATE LignesMenus SET repasId = 272, alimentId = 16, quantite = 800 WHERE id =345; ]
    [ UPDATE Jour SET semaineId = 177, nom = 'Mercredi' WHERE id =221; ]
    [ SELECT id FROM Repas WHERE jourId=221; ]
    [ UPDATE Repas SET jourId = 221, heure = 20, nom = 'DFGF' WHERE id =273; ]
    [ SELECT id FROM LignesMenus WHERE repasId=273; ]
    [ UPDATE LignesMenus SET repasId = 273, alimentId = 21, quantite = 350 WHERE id =346; ]
    [ UPDATE Repas SET jourId = 221, heure = 14, nom = 'YUTY' WHERE id =274; ]
    [ SELECT id FROM LignesMenus WHERE repasId=274; ]
    [ UPDATE LignesMenus SET repasId = 274, alimentId = 13, quantite = 200 WHERE id =347; ]
    [ UPDATE Jour SET semaineId = 177, nom = 'Samedi' WHERE id =222; ]
    [ SELECT id FROM Repas WHERE jourId=222; ]
    [ UPDATE Repas SET jourId = 222, heure = 10, nom = 'ghgh' WHERE id =275; ]
    [ SELECT id FROM LignesMenus WHERE repasId=275; ]
    [ UPDATE LignesMenus SET repasId = 275, alimentId = 13, quantite = 200 WHERE id =348; ]
    [ UPDATE Jour SET semaineId = 177, nom = 'Vendredi' WHERE id =223; ]
    [ SELECT id FROM Repas WHERE jourId=223; ]
    [ UPDATE Repas SET jourId = 223, heure = 16, nom = 'DFGFD' WHERE id =276; ]
    [ SELECT id FROM LignesMenus WHERE repasId=276; ]
    [ UPDATE LignesMenus SET repasId = 276, alimentId = 9, quantite = 789 WHERE id =349; ]
    [ UPDATE Semaine SET poids = 70.0, masseMaigre = 80.0, premierJour = 1193612410880, utilisateurId = 67, objectifId = 3 WHERE id =179; ]
    [ SELECT id FROM Jour WHERE semaineId=179; ]
    [ SELECT id FROM AlimentsInterdits WHERE utilisateurId=67; ]
    [ UPDATE AlimentsInterdits SET utilisateurId = 67, alimentId = 14 WHERE id =57; ]
    [ UPDATE AlimentsInterdits SET utilisateurId = 67, alimentId = 21 WHERE id =58; ]
    Le 1er enregistrement dure 1sec, le 2ème 6sec et le 3ème plus d'1mn.
    Quelqu'un pourrait-il me dire ce qui fait chuter les perfs à cette vitesse svp?

    Voici quelques bouts de code qui pourront peut-être vous mettre sur la voie :

    Classe Connexion.java :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    /**
     * Classe gérant la connexion à la base données selon le pattern Singleton
     * afin d'éviter une multiplication des connxions et une chute des performances.
     * @version 1.0
     */
     
    public class Connexion
    {
         // <editor-fold defaultstate="collapsed" desc=" Champs ">    
     
         /** Instance du singleton.  */
         private static Connexion INSTANCE = null;
     
         /** Connexion à la base de données.*/
         private Connection cnx = null; 
     
         // </editor-fold>
     
         // <editor-fold defaultstate="collapsed" desc=" Constructeurs ">
     
         /** 
          * Constructeur privé : permet de supprimer le constructeur public et oblige à passer par la méthode {@link #getInstance()}
          * pour utiliser la classe.
          */
         private Connexion() 
         {
            try
            {
                cnx = DriverManager.getConnection("jdbc:odbc:Nutrisoft");
            }
            catch (SQLException ex)
            {
                System.out.println("Connexion échouée");
                ex.printStackTrace();
            }
         }
     
         /** Constructeur privé de la classe qui empeche la multiplication d'instances. */
         private synchronized static Connexion getInstance() 
         {
             if (INSTANCE == null) 
                 INSTANCE = new Connexion();
             return INSTANCE;
         }
     
         // </editor-fold>              
     
         // <editor-fold defaultstate="collapsed" desc=" Getters & Setters ">
     
         /**
          * Donne la connexion.
          * @return Connexion.
          */
         public static Connection getCnx()
         {
             return getInstance().cnx;
         }
     
         // </editor-fold>     
    }
    Classe InterfaceBd.java :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    /** 
     * Cette classe gere les interactions avec la base de données.
     * @version 1.0
     */
    public abstract class InterfaceBd
    {
        // <editor-fold defaultstate="collapsed" desc=" Champs ">
     
        /** Statement de la connection. */
        private Statement st = null;
     
        /** Connexion à la base de données. */
        private Connection con = null;
     
        // </editor-fold>
     
        // <editor-fold defaultstate="collapsed" desc=" Constructeurs ">
     
        /** Constructeur. */
        public InterfaceBd()
        {
        }
     
        /** Initialisation de la connexion. */
        private void init()
        {
           if(con == null)
           {
               // Configuration du driver
               try
               {
                   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                   // Etablissement de la connexion
                   con = Connexion.getCnx();
               }
               catch(ClassNotFoundException cnfe)
               {
                   System.out.println("La classe du driver ODBC n'a pas été trouvée");
                   cnfe.printStackTrace();
               }
           }
        }
     
        // </editor-fold>
     
        // <editor-fold defaultstate="collapsed" desc=" Gestion de la bd ">
     
        /** 
         * Execute une requete SQL de consultation.
         * @param rq Requête SQL.
         * @return Resultat de la requête SQL.
         */
        public ResultSet query(String rq)
        {
           System.out.println("[ " + rq + "; ]");
     
           init();
           try
           {
               st = con.createStatement();
               ResultSet res = st.executeQuery(rq);
               return res;
           }
           catch (SQLException ex) 
           {
               System.out.println("Requete SQL invalide!");            
               ex.printStackTrace();
               return null;
           }
        }
     
        /**
         * Execute une requete SQL de mise à jour.
         * @param rq Requête SQL.
         */
        public void update(String rq)
        {
           System.out.println("[ " + rq + "; ]");
           init();
           try
           {
               st = con.createStatement();
               st.executeUpdate(rq);
           } 
           catch (SQLException sqlex) 
           {
               System.out.println("Requete SQL invalide!");            
               sqlex.printStackTrace();
           }
           catch(Exception ex)
           {
               ex.printStackTrace();
           }
           close(null);
        }
     
        /**
         * Ferme la connexion.
         * @param res ResultSet d'une requetet SQL.
         */
        public void close(ResultSet res)
        {
            try
            {
                if(res != null)
                    res.close();
                if(st != null)
                    st.close();
            }
            catch (SQLException ex)
            {
                ex.printStackTrace();
            }
        }
    [..]
    }

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    C'est bon j'ai trouvé. J'avais oublié de fermer les Resultset et Statement d'un bon nombre de constructeurs. Dans la F.A.Q, ils disaient que le garbage collector s'en occupait mais qu'il valait mieux fermer soi même. Effectivement il vaut mieux lol!

  3. #3
    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,


    Attention : le GC n'a pas à fermer les ResultSet/Statement/Connection !
    En fait c'est tout simplement que si l'implémentation du driver JDBC est bien faite il peut y avoir un garde-fou qui fait que la méthode finalize() ferme l'objet (pour rappel cette méthode est appelé lors de la "destruction réelle" de l'objet.

    Mais pour le GC les ResultSet/Statement/Connection ne sont que de simples objets qui ne représentent pas grand chose en mémoire (en général cela prend les ressources du serveur de base de données), et il peut prendre la décision de les supprimer plus tard pour laisser la main au traitement courant...

    a++

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

Discussions similaires

  1. [MySQL] Lire plusieurs tables avec des join ou requête à chaque fois à l'intérieur d'une boucle
    Par padre.cedano dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 30/01/2015, 09h44
  2. Performances sur des millions de requêtes
    Par Bryce de Mouriès dans le forum Requêtes
    Réponses: 1
    Dernier message: 25/12/2009, 23h38
  3. [VB.NET] [ODBC] Récupérer des valeurs avec requête ODBC?
    Par Pleymo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/03/2005, 16h38
  4. Audit des performances d'une application Web
    Par jpg dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 16/09/2004, 10h45

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