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 :

Application avec JDBC MySQL distant sur VPS très très lent


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut Application avec JDBC MySQL distant sur VPS très très lent
    bonjour,
    je suis en train de modifier une ancienne appli (locale) de gestion de planning qui utilisait une bdd derby embedded. L'ensemble était plutôt rapide. Mais je souhaite aujourd'hui utiliser une bdd mysql distante sur mon vds. J'ai donc mis à jour le drivers jdbc mysql, tout semble fonctionner parfaitement.

    Cependant je trouve les temps de réponses des requêtes plutôt long. Je suis passé de 1/2 seconde (en ederby) à plus 10 secondes en mysql distant pour la même demande.

    Qu'en pensez vous ? Il y aurait' il un moyen d'optimisé mes requêtes ou l'utilisation du drivers jdbc.

    PS/ J'ai déja réalisé une appli air (flex avec une connexion en httpservices a une bdd mysql sur le même serveur (vds) pour des volumes de données beaucoup plus important et c'est dix fois plus rapide.

    Je suis sur le cul et je ne sait pas quoi faire.

    Merci de votre retour.

    Bien cordialement
    Nicolas

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    c'est quelle techno? plain old jdbc, un orm, etc? tu utilises un pool de connexion, ou alors la connexion est ouverte/fermée à chaque requêtes? on peut voir les requêtes? quand tu les exécutes localement, elles sont rapides? tu as quelle latence réseau?

    sinon, un petit coup de profiler pourrait permettre de voir où est perdu la majeure partie du temps (même si de base, je miserais sur le réseau)

  3. #3
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut
    Merci pour cette réponse rapide.

    En fait je fait du basic : connexion - requête puis déconnexion.
    Pour le code c'est entièrement fait maison

    La requête qui me sert de test et un simple select avec une condition where puis une boucle pour des insert pour chaque valeur du select

    Je viens de refaire un test avec une bdd mysql local sous WAMP et c'est nettement plus rapide moins qu'en ederby mais beaucoup plus que sur la bdd distante.


    J'aimerais bien faire un profiler mais étant un pur autodidact je ne sais pas comment m'y prendre et j'utilise netbean comme ide. Peut etre pouvez vous m'aider pour cela ?

    Merci
    Nicolas

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    tu peux commencer à regarder ici par exemple: https://profiler.netbeans.org/

    le profiling, c'est vaste et ça peut être compliqué (pour interpréter correctement les résultats).

    par contre, ce que je peux déjà dire, c'est qu'un petit pool de connexion tout simple va déjà éliminer le coût d'ouverture des connexions à chaque requête: http://java.developpez.com/faq/jdbc/?page=dataSources

  5. #5
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut
    Dans ma version de netbean j'ai le profiler après la calibration cela fonctionne. Et comme tu l'avais prédit pas super simple a interprété.

    Lors de l’exécution de ma requête j'ai une fonction qui prend 24000ms (

    Voila la fonction de ma class C_Connection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public int updateSql(String sql) {
            this.erreurSql = "";
            int nb = -1 ;
            try {
                stat = con.createStatement();
                nb = stat.executeUpdate(sql);
                stat.close();
                return nb;
            } catch (SQLException sqle) {
                erreurSql = "sql erreur : " + sqle.toString();
                return nb;
            } 
        }
    En fait cette fonction est appelé dans une boucle qui parcoure un select effectué précédemment.

    et voila la boucle
    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
    while(rstemp.next()){
                        
                        int hh = Integer.parseInt(rstemp.getTime(3).toString().substring(0,2));
                        int mm = Integer.parseInt(rstemp.getTime(3).toString().substring(3,5));
                        int ss = Integer.parseInt(rstemp.getTime(3).toString().substring(6,8));
                        double h = rstemp.getDouble(5);
                        int dhh = (int)h;
                        double dmmtemp = (rstemp.getDouble(5)-dhh)*600;
                        int dmm = (int)(dmmtemp/10);
                        caltemp.set(a,m,Integer.parseInt(planning[x][1]),hh,mm,ss);
                        
                        String timedeb = a+"-"+(m+1)+"-"+planning[x][1]+" "+hh+":"+mm+":"+ss;
                        timedeb=formatTStamp(timedeb);
                       
                        caltemp.add(Calendar.HOUR, dhh);
                        caltemp.add(Calendar.MINUTE,dmm);
                        String timefin = caltemp.get(Calendar.YEAR)+"-"+(caltemp.get(Calendar.MONTH)+1)+"-"+caltemp.get(Calendar.DAY_OF_MONTH)+" ";
                        timefin += ""+caltemp.get(Calendar.HOUR_OF_DAY)+":"+caltemp.get(Calendar.MINUTE)+":"+caltemp.get(Calendar.SECOND);
                        timefin=formatTStamp(timefin);
                       
                        String reqtmp = requp + " "+rstemp.getInt(1)+"," + rstemp.getInt(2)+"," + "'"+rstemp.getTime(3)+"'," + "'"+rstemp.getTime(4)+"'," + rstemp.getDouble(5)+","+ rstemp.getDouble(6)+","+ rstemp.getDouble(7)+",1,'"+timedeb+"','"+timefin+"',"+ rstemp.getInt(8)+")";
                        
                        try {
                            int res = connection.updateSql(reqtmp);
                            if(res<0)
                                JOptionPane.showMessageDialog(this,this.connection.getErreurSql(),"erreur classe connection",JOptionPane.INFORMATION_MESSAGE);
                        } catch (HeadlessException e) {
                            JOptionPane.showMessageDialog(null,e.toString(),"erreur",JOptionPane.INFORMATION_MESSAGE); }
                        
                    }
    Je penses que le pool devrait gagner quelques ms mais est ce applicable dans mon cas ?

    Il faudrait ouvrir la connexion avant la boucle, executer les update dans la boucle puis fermer.

    Merci de ton retour

    Nicolas

  6. #6
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut
    Euh,

    Je crois que j'ai eu un bug et je confond connexion et statement.

    Il faudrait que je vérifie mais le getconnection est réalisé dans la fonction init de l'appli et après je fais des createStatement pour chaque requête.

    est ce la même chose, je ne crois pas

    gloup je googleraryse et je reviens !!


    et au fait : je ne renonce jamais !!

    -------------------------------------------------------
    Me revoila

    En fait je crois que je fais déja comme un pool. C'est pas aussi clair que dans la Faq mais j'ouvre la connection au lancement de l'appli et je la ferme quand je la quitte !!!


    Donc du coup ça va etre dur de gagner des ms .............

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

Discussions similaires

  1. Aide: une application avec base de donner sur le web
    Par maverick_lp28 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 16/04/2009, 13h21
  2. Comment lier application avec une base distante
    Par Duke_MBA dans le forum VB.NET
    Réponses: 12
    Dernier message: 24/11/2008, 07h44
  3. Connexion jdbc-mysql(distant) sur ubuntu
    Par astrotouf dans le forum JDBC
    Réponses: 1
    Dernier message: 28/10/2008, 11h13
  4. Choix d'un langage pour application avec bdd mysql
    Par tonio-lille dans le forum Windows
    Réponses: 5
    Dernier message: 09/11/2006, 17h01
  5. Réponses: 2
    Dernier message: 16/01/2006, 11h38

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