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

Servlets/JSP Java Discussion :

[servlet] optimisation ou changement d'idée ?


Sujet :

Servlets/JSP Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut [servlet] optimisation ou changement d'idée ?
    Bonjour

    J'ai une servlet de type doGet. Son but est d'appliquer un XSL à un XML.
    Cependant mon XML est stocké dans une table oracle telle que
    (NB: c'est stocké dans une table oracle car les XML correspondent à des états de commandes/clients/fournisseurs et en version "fichier" il y aurait qqchose comme 100 000 fichiers... c'est qui n'est pas la panacée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> desc xml_db_ligne;
     Name                            Null?    Type
     ------------------------------- -------- ----
     NOM_COLLECTION                  NOT NULL VARCHAR2(80)
     TEXTE                                    VARCHAR2(4000)
    Je passe donc en parametre le "nom_collection" à ma servlet qui fait une connexion JDBC et va chercher toutes les bonnes lignes (getParametreXML est une fonction qui recupére le nom_collection en fonction du request) avec un code du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    String xml= null;
    Statement recupxml = null;
    String sql = "select texte from xml_db_ligne where nom_collection='"+getParametreXML(request) +"'";
    recupxml=connex.createStatement();
    recupxml.executeQuery(sql);
    LignesXML = recupxml.getResultSet();
    String ligne=null;
    while(LignesXML.next())
    {
           ligne = LignesXML.getString("TEXTE");
            if (ligne!=null) xml= xml + ligne;
    }
    quand cette partie est finie, je fais la transformation dont voici un extrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DocumentBuilder builder = factory.newDocumentBuilder();
    builder.setErrorHandler(handler);
    document=builder.parse(new InputSource(new StringReader(xml)));
    Mon problème étant un gros problème de performance, j'aurais voulu savoir si :
    - la méthode utilisée était la bonne
    - si non, que pourrais-je envisager ?
    - si oui, comment optimiser le plus possible cette méthode ?

    Merci d'avance

    PS: je suis en galère et ca commence à devenir... pressant

  2. #2
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    Il faut tout d'abord que tu analyses ce qui te prend vraiment du temps.
    Est-ce la requête SQL ? si oui, as-tu créé un index sur ta colonne "nom_collection" par exemple ?
    Si c'est dans l'application de ta feuille de style, là on n'y peut rien sans connaitre le code xslt.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut
    à priori c'est dans la requete SQL... au dumoins quelquepart dans ma servlet

    en effet, j'ai 2 versions de cette servlet :
    -l'une qui va chercher le XML sous forme de fichiers (cette servlet est "deprecated" pour les raisons que j'ai evoqué dans le post précédent)
    -la seconde qui le prend dans la table (celle qui pose problème)

    j'ai donc fait une grosse série de test et en voici mes conclusions :
    pour charger une meme page, avec le meme XSL, la servlet "fichier" met environ 15 secondes alors que la servlet "table" met 1min30...

    j'en ai conclu (p-e abusivement) que c'était la requete SQL qui "merdoyait"...

    qu'en pensez-vous ? que faire dans ce cas ? y'a pas a priori mieux comme solution ? est ce que je peux réellement(et si oui comment) "cibler" la partie de code qui prend tout ce temps ?

    merci de votre aide préciseuse

  4. #4
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    As-tu mis un indexe sur la colonne nom_collection ?
    si ce n'est pas le cas, la lenteur peut venir de ce point.
    Ajoute un indexe et tu verras, les résultats sont souvent étonnants !!!

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut
    ok je vais demander au DBA de faire ca (ps: c'est pas moi )

    sinon tu penses que je peux diviser mes temps de réponse par 9 en faisant juste un index sur ma colonne ?

    quoiqu'il en soit, ca coute rien d'essayer ! j'en reparle tout a l'heure !

    a++

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut
    ben oui a priori c'est indexé... et quand on fait la requete "select" depuis sqlplus y'a aucun prob, ca prend une demi seconde

    ca doit donc venir de la servlet... n'y a t'il pas de meilleur moyen de récuperer les résultats et de les traiter qu'avec un boucle comme j'ai fait ??
    p-e ne faut t'il pas faire un string tres long que l'on parse apres ?

    merci d'avance !!!

    a++

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    Je vois dans ton code que tu concatènes tes lignes XML.
    Tu peux déjà utiliser un StringBuffer plutôt que de concaténer tes String, même si je ne pense pas que cela divise par 6 ton temps de réponse.

    Tu as combien d'entrées pour une même collection dans ta table xml_db_ligne ?
    Pourquoi ne pas mettre ton fichier complet dans un CLOB ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut
    StringBuffer ??? ok je vais essayer tu crois que ca ameliorera un peu ? y'a pas d'effet de bord ? de limite ?

    pour une meme collection, j'ai entre 5 et 700 entrées dans xml_db_ligne... et le problème vient biensur des collections a 700 entrées...

    a l'heure actuelle chaque ligne comprend 1000 caracteres, mais mon resp a en porjet de passer a 4000... si toutefois la non plus il n'y a pas de probleme a priori

    le coup de CLOB je viens de voir ca sur un forum, mais a priori je suis passur que ca soit pratique a mettre en place... a moins que je n'ai pas tout compris

    actuellement, on a procedure sql qui a partir d'une multitude de bases et tables, se débrouille pour générer un xml que l'on met ligne par ligne dans une table (la fameuse xml_db_ligne) a hauteur de 1000 caracteres par ligne

    voila si y'a d'autres idées qui germent à partir de ces nouvelles infos...

    merci !!!

  9. #9
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    je viens de faire un test.

    je cree une String de 1000 caracteres, et je fais une boucle de 700 iterations dans laquelle je concatene les String

    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
        String str = ...; // 1000 caracteres
        String res = "";
     
        long d = System.currentTimeMillis();
        for (int i = 0; i < 700; i ++) {
          res += str;
        }
        System.out.println(System.currentTimeMillis() - d);
     
        res = "";
        d = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 700; i ++) {
          sb.append(str);
        }
        res = sb.toString();
        System.out.println(System.currentTimeMillis() - d);
    sans StringBuffer : 36573 ms
    avec StringBuffer : 90 ms

    Reste à optimiser tes acces a la base....

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut
    ah ouais c'est quand meme flagrant !!!

    je vais me lacher...

    enfin juste un détail pour pouvoir ensuite parser correctement il faut que la varible xml soit de type string dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    builder.setErrorHandler(handler); 
    document=builder.parse(new InputSource(new StringReader(xml)));
    ou alors il faut que je change la dernière ligne ??? mais en mettant quoi a la place ? a priori d'apres la javadoc, il y a 3 surcharges pour créer un InputSource (et je suis pour l'instant dans le 2eme cas) :

    InputSource(InputStream byteStream)
    Create a new input source with a byte stream.

    InputSource(Reader characterStream)
    Create a new input source with a character stream.

    InputSource(String systemId)
    Create a new input source with a system identifier.
    en tout cas merci bp cette aide m'a d'ores et déjà été précieuse !

    EDIT2 : apparemment j'ai dit un connerie dans l'edit1... ca doit etre la faim qui fait ca ! bon app' je reviens tout a l'heure

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut
    Génial ! ca marche !!! merci beaucoup vous m'enlevez une énorme épine monstrueuse du pied !!!

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

Discussions similaires

  1. Optimisation affichage changement onglet
    Par mactwist69 dans le forum VB.NET
    Réponses: 6
    Dernier message: 18/08/2010, 15h59
  2. optimisation ou changement de modèle?
    Par gapse dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/04/2007, 14h05
  3. [idée] rtsp servlet
    Par ebaynaud dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 28/09/2006, 16h09
  4. changement de l'url servlet->jsp par dispatcher
    Par minirom dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 14/08/2006, 15h20

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