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

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

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    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
    Points : 3 675
    Points
    3 675
    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)
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

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

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    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
    Points : 3 675
    Points
    3 675
    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
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

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

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    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 régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    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 .............

  7. #7
    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
    Points : 3 675
    Points
    3 675
    Par défaut
    Ok, quelques remarques (ça n'est pas formcément lié aux perfs, mais ça me tire les yeux donc j'en parle )

    - les statements doivent être fermé dans un finally de préférence, tout comme la plupart des resources
    - au lieu de créer des miliers de statements, tu peux utiliser des "preparedstatements" lorsqu'il faut exécuter une même requête plusieurs fois avec des paramètres différents (ça devrait te donner un coup de boost niveau perf)
    - en mettant des preparedstatement, tu prend du même coup une bonne habitude et évitera les problèmes d'attaques par injection sql à l'avenir
    - catcher HeadlessException et tenter d'afficher un JOptionPane dans le catch, comment dire... c'est pas le top HeadlessException indique justement que l'interface graphique n'est pas disponible, donc soit tu catch pas, soit tu logs


    et au fait : je ne renonce jamais !!
    c'est ça qu' c'est bon !!
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  8. #8
    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
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par nma Voir le message
    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 !!!
    ok alors rien à dire de ce côté... essaie de limiter le nombre de statements (en utilisant des preparedstatement), y'a de grandes chances que tu prennes un boost non négligeable
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

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

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Merci de ton aide je vois gratter du coté des preparestatement et modifier mon code.

    Pour les catch en fait vue que ce code date de presque 8 ans, je catchais les erreurs sans distinction et avec l’évolution du sdk et de netbeans j'avais des erreurs car il faut catcher précis maintenant alors j'ai laissé les propositions automatiques de netbean pour aller plus vite. Effectivement ce n'est pas très judicieux. Mais je corrigerais tout cela une fois les "gros" problème solutionnés.

    J'ai un bon millier d'avertissement avec le sdk dernière version et je dois gratter un peu car cela fait quelques temps que j'ai pas coder. Ca reviens mais dur dur !!

    Encore merci à toi, je modifie et je profile et je vous tiens au courant.
    @+
    Nicolas

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

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Eh voila le travail !!
    Je suis descendu à 3500ms au lieu de 24300. YES

    J'ai tout d’abord modifié les insert en un insert multiple pour voir ! -> un seul appel a jdbc
    Et la je me suis rendu compte grâce au profiler que j'avais fait une fonction avec une requête pour les jours de la semaine qui bien sur est appelé a chaque insert -> le gros boulet

    J'ai donc créé une nouvelle fonction appelé dans l' init() qui me crée un tableau des jours.

    Ce n'est pas encore aussi rapide que je le voudrais mais cela reste correct. En sachant que cette fonction génère tous les plannings de tous les postes du mois demandé en fonction des horaires (vacations) et des jours. (1 fois par mois sur demande).

    Je penses que si je continue à analysé mon vieux codes avec ce profiler, je vais découvrir que j'ai fait des choses dont je ne devrait même pas parler sur ce forum de spécialiste

    En tout cas merci, si vous avez des commentaires ou des idées, je suis preneur.

    Nicolas

  11. #11
    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
    Points : 3 675
    Points
    3 675
    Par défaut
    reste à mettre en place des transactions, pour éviter qu'une erreur en milieu de traitement ne bousille les données
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Tu peux aussi utiliser les batch pour les insertions massives.
    Ta base Mysql est directement accessible de l'extérieur par le réseau ?
    C'est pas super niveau sécurité, si c'est le cas.

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

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Ta remarque sur la sécurité m' intéresse !!

    Car j'avoue que j'ai quand même du mal à voir comment quelqu'un qui n'a pas mes informations pourrait m'attaquer.
    Je m'explique

    1/ il doit connaitre l'adresse du serveur mysql, le port utilisé
    2/ Le nom de la bdd ainsi que le nom des tables
    3/ Certainement un user et un password pourrait aider

    D'autant que ce serveur mysql est sur un vds sécurisé un minimum normalement et que les user des bdd ne peuvent accéder au schéma.

    Peut etre que je ne suis pas complètement informé des risques.
    C'est vrais les injections sql mais comment balancer des requêtes sans un minimum d'info ?

    Je dois dire que je ne voie pas, prudence est mère de sureté mais dans ce cas comment utilisé une bdd distante de façons securitaire ?

    Nicolas

  14. #14
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    En mettant en place des WebServices sur ton serveur qui offrent les opérations dont ton application a besoin (globalement, tu exportes la partie BDD de ton application et tu crées des WebServices autours, puis tu utilises ces WebServices dans ton application.

    Ca diminuera largement la latence réseau due aux requêtes, te permettra de fermer les ports d'accès à la base de données, de maîtriser les ponts d'entrée pour celle ci et ainsi de suite.
    Une base de donnée n'est pas considéré comme un logiciel secure en soi en vrai, et même relativement fragile, et son port ne devrait pas être ouvert à tous vents (au pire via un tunnel ssh/VPN, voir pas du tout et accessible uniquement en ligne de commande depuis le serveur).
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

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

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    J'ai tendance à utiliser des httpservices que je trouves beaucoup plus simple (en tout cas en flex), avec des réponses en xml généré par du php.
    Cela doit être à peut prêt identique en termes de sécurité que le webservices ?

    Merci @ tous de vos réponses et de votre interet

    Nicolas

  16. #16
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Les services rest (ou httpservices ou whatever) restent des web services. Il ne faut pas confondre SOAP et Web Services.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

+ 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, 14h21
  2. Comment lier application avec une base distante
    Par Duke_MBA dans le forum VB.NET
    Réponses: 12
    Dernier message: 24/11/2008, 08h44
  3. Connexion jdbc-mysql(distant) sur ubuntu
    Par astrotouf dans le forum JDBC
    Réponses: 1
    Dernier message: 28/10/2008, 12h13
  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, 18h01
  5. Réponses: 2
    Dernier message: 16/01/2006, 12h38

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