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 :

Driver MySQl : Lenteur ?


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2003
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 71
    Par défaut Driver MySQl : Lenteur ?
    Bonjour à tous,


    j'ai un petit souci technique avec MySQL, ou plus precisement son driver JDBC.

    Alors voilà : j'ai crée une procédure stockée sur ma base de MySQL v5, que j'appelle dans le browser distribué via le site de MySQL (MySQL Query Browser) : bon une 1ère fois la requête met du temps (chargement en mémoire je pense), puis c'est assez rapide, du genre 7 ms.

    Je prends le JAR utilisé par MySQL Query Browser : mysql-connector-java-5.0.4-bin.jar (1)
    Je le mets dans mon programme en lieu et place de mon ancien JAR : mysql-connector-java-3.1.12-bin.jar (2)
    Quand je lance mon appli Java, où je ne fais alors qu'appeler ma procédure stockée et récupérer mon résultat, le temps du traitement est de 16 ms en moyenne. A noter que c'est le même temps avec le JAR (1) ou (2).

    Donc :
    Avec le JAR (1) de MySQL Query Browser => sous MySQL QueryBrowser, ça prend 7 ms
    Avec le JAR (1) ou (2) ... => via Java, ça prend 15~16 ms pour les deux drivers.

    Quelqu'un aurait'il une idée du pourquoi de la différence de temps de traitement ?


    A noter que je me mets aux Procs Stocks pour essayer justement de gagner du temps dans mon traitement :
    Faire des requêtes SQL dans une Proc Stock, au lieu de faire requête SQL + code Java + requête SQL + code java.

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Ce n'est pas évident de te répondre avec les éléments que tu donnes...
    Pourrais-tu mettre ici ton code où est-ce trop gros ?
    Comment mesures-tu le temps ? De où à où ? Si tu appelles deux fois de suite la proc stock dans Java sans refermer la connection, ça prend 30s ou après la première fois tu gagnes ? Es-tu sûre de n'utiliser aucun cache lorsque tu effectue la requête plusieurs fois avec QueryBrowser etc ...

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2003
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 71
    Par défaut Code
    Alors voilà le code Java où j'appelle ma Procédure Stocké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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    long startTime = System.currentTimeMillis();
     
            CallableStatement cs = null;
            ResultSet rs = null;
     
            // initialisation du nombre de parts pour le Responsable, sur le fonds considere, a la date donnee
            double dStockNbParts = 0.0d;
            try{
                cs = getConnection().prepareCall("{call CalculerStockNbParts(?, ?, ?)}");
                cs.setInt(1, idEntiteResponsable);
                cs.setInt(2, idFonds);
                cs.setDate(3, new java.sql.Date(dateFinHistorique.getTime()));
     
                rs = cs.executeQuery();
                if(rs.next()){
                    dStockNbParts = rs.getDouble("nbPartsStockTotal");
                }
                rs.close();
                cs.close();
     
            }catch(SQLException sqle){
                sqle.printStackTrace();
                throw new SQLException("Impossible d'exécuter la requête: " + sqle.toString());
            }finally{
                releaseResultSet(rs);
                rs = null;
                releaseStatement(cs);
                cs = null;
            }
     
            long endTime = System.currentTimeMillis();
            System.err.println("(PS) Temps pour calculer les parts (idER, idFonds, date) = ("
                    +idEntiteResponsable+", "+idFonds+", "+GUI.date2Stringdd_MM_yyyy(dateFinHistorique)+") : "+(endTime-startTime)+" ms"
                    +" - call CalculerStockNbParts("+idEntiteResponsable+", "+idFonds+", '"+UtilsDate.convertDateToString(dateFinHistorique, "yyyy-MM-dd")+"')"
            );
    Note : la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    releaseResultSet(ResultSet rs)
    a pour objet de cloturer correctement le ResultSet, en gérant le cas où cette cloture lancerait elle-aussi une SQLException.
    Même principe pour "releaseSteament(Statement stmt)";


    Bien sûr du côté MySQLQueryBrowser c'est plus simple, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call CalculerStockNbParts(1, 8, '2007-01-11');

  4. #4
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Tu peux essayer ça et me dire combien de temps ça prend ?
    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
     
    long startTime = System.currentTimeMillis();
     
            CallableStatement cs = null;
            ResultSet rs = null;
     
            // initialisation du nombre de parts pour le Responsable, sur le fonds considere, a la date donnee
            double dStockNbParts = 0.0d;
            try{
    Connection cn = getConnection();
                cs = cn.prepareCall("{call CalculerStockNbParts(?, ?, ?)}");
                cs.setInt(1, idEntiteResponsable);
                cs.setInt(2, idFonds);
                cs.setDate(3, new java.sql.Date(dateFinHistorique.getTime()));
     
                rs = cs.executeQuery();
                if(rs.next()){
                    dStockNbParts = rs.getDouble("nbPartsStockTotal");
                }
                rs.close();
                cs.close();
    cs = cn.prepareCall("{call CalculerStockNbParts(?, ?, ?)}");
                cs.setInt(1, idEntiteResponsable);
                cs.setInt(2, idFonds);
                cs.setDate(3, new java.sql.Date(dateFinHistorique.getTime()));
     
                rs = cs.executeQuery();
                if(rs.next()){
                    dStockNbParts = rs.getDouble("nbPartsStockTotal");
                }
                rs.close();
                cs.close();
     
            }catch(SQLException sqle){
                sqle.printStackTrace();
                throw new SQLException("Impossible d'exécuter la requête: " + sqle.toString());
            }finally{
                releaseResultSet(rs);
                rs = null;
                releaseStatement(cs);
                cs = null;
            }
     
            long endTime = System.currentTimeMillis();
            System.err.println("(PS) Temps pour calculer les parts (idER, idFonds, date) = ("
                    +idEntiteResponsable+", "+idFonds+", "+GUI.date2Stringdd_MM_yyyy(dateFinHistorique)+") : "+(endTime-startTime)+" ms"
                    +" - call CalculerStockNbParts("+idEntiteResponsable+", "+idFonds+", '"+UtilsDate.convertDateToString(dateFinHistorique, "yyyy-MM-dd")+"')"
            );

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2003
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 71
    Par défaut
    Mmmhhh ...
    Pas grand chose : on appelle 2 fois la même procédure stockée, on le temps de traitement est donc doubel : 32 (en moyenne) au lieu de 16ms (en moyenne).

    Par ce test, qu'est ce qu'on testait ?

Discussions similaires

  1. Jar integration driver mysql
    Par cerede2000 dans le forum Général Java
    Réponses: 2
    Dernier message: 20/04/2006, 17h49
  2. [PDO] Problème avec le driver MySQL ?
    Par SimMaster dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 11/04/2006, 19h01
  3. [Tomcat]Tomcat ne trouve pas les driver mysql
    Par Lash3r dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 06/01/2006, 01h12

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