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 :

Comment optimiser le chargement d'une JSP ?


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2010
    Messages : 37
    Points : 23
    Points
    23
    Par défaut Comment optimiser le chargement d'une JSP ?
    Bonjour à tous..
    Voici mon souci.. j'ai un site Jsp/servlets/mysql d'annonces qui tourne sous GlassFish 3 et la page d'accueil met une éternité (15sec.) à se charger.

    Je cherche donc quelques conseils pour limiter ce temps de chargement.

    Voici comment le site fonctionne, l'idée étant de gérer la consultation des annonces par l'utilisateur uniquement avec des script coté client.

    via index.jsp j'effectue une connexion à la base mysql et créer toutes les annonces dans des <div> cachées en jsp...
    Ensuite l'affichage ou non des annonces est géré coté client...

    Tout les connexions sont réalisées de manières séquentielles (connexion pour les annonces d'appart, puis les évennements, puis les voitures...) c'est sans doutes ce qui prend du temps..

    Si je découpe index.jsp et utilise <include> cela permet-il d'obtenir une réponse plus rapide du serveur ?

    Je suis preneur de tout bon conseils..

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par crepy Voir le message
    j'effectue une connexion à la base mysql et créer toutes les annonces dans des <div> cachées en jsp...
    Ensuite l'affichage ou non des annonces est géré coté client...
    Et il y a combien d'annonces sur la pages, le html généré fait quelle taille? Es-tu sur que c'est le JSP qui prend du temps et pas le navigateur qui met trois plombe à calculer l'affichage?

    Tout les connexions sont réalisées de manières séquentielles (connexion pour les annonces d'appart, puis les évennements, puis les voitures...) c'est sans doutes ce qui prend du temps..
    Combien de connexions pour afficher une page?

    Si je découpe index.jsp et utilise <include> cela permet-il d'obtenir une réponse plus rapide du serveur ?
    Pourquoi poser la question et pas simplement essayer?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2010
    Messages : 37
    Points : 23
    Points
    23
    Par défaut Quelque réponses..
    Et il y a combien d'annonces sur la pages, le html généré fait quelle taille? Es-tu sur que c'est le JSP qui prend du temps et pas le navigateur qui met trois plombe à calculer l'affichage?
    Pour l'instant y en a pas beaucoup c'est ça qui me fait peur, genre 10 annonces en tout, le jsp généré par GlassFish fait 59K (et j'ai pas trouvé le html )..

    Combien de connexions pour afficher une page?
    Les connexions son gérées par une classe spécifique à la quelle je fait appel
    pour chaque type d'annonce qui me renvoie un tableau de données à traiter (tab de voiture, tab, d'appart..etc..)
    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
     
    public class ConnectionManager {
        static Connection con;
        static String url;
     
        public static Connection getConnection() {
            try {
                url = "jdbc:mysql://dbmysql200.my-hosting-panel.com:3306/kquiere_db";
     
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     
            try { con = DriverManager.getConnection(url,":P",";)");
     
            } catch (SQLException ex) {
                //ex.printStackTrace();
            }
            } catch(ClassNotFoundException e) {
                //System.out.println(e);
            }
     
            return con; }
    }
    en tout 6 connexions (chaque connexion est fermée à la fin du traitement)
    par exemple :
    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
     
    public static ArrayList listAllCarToArray() throws SQLException{
     
            //preparing some objects for connection
            Connection currentCon = null;
            Statement stmt = null;
            int updateQuery = 0;
     
            ArrayList cars = new ArrayList();
     
            String queryString = "SELECT * FROM car";
     
            try {
                //connect to DB
                currentCon = ConnectionManager.getConnection();
                stmt=currentCon.createStatement();
                ResultSet rs = null;
                rs = stmt.executeQuery(queryString);
                rs.last();
                int tot = rs.getRow();
                rs.first();
                System.out.println("Row count : "+tot);
                for(int i=0; i<tot;i++){
                    CarBean ca = new CarBean();
                    ca.setId(Integer.parseInt(rs.getObject("id").toString()));
                    ca.setBrand((String) rs.getObject("brand"));
                    ca.setModel((String) rs.getObject("model"));
                    ca.setPhoto((String) rs.getObject("photo"));
                    ca.setInfo((String) rs.getObject("info"));
                    ca.setIdcard_publisher((String) rs.getObject("idcard_publisher"));
                    ca.setKm_count((String) rs.getObject("km_count"));
                    ca.setPrice((String) rs.getObject("price"));
                    ca.setYear((String) rs.getObject("year"));
                    ca.setPromo((String) rs.getObject("promo"));
                    cars.add(i,ca);
                    rs.next();
                }
                if (updateQuery != 0) {
                }
            } catch (Exception ex) {
                System.out.println("Pb avec num list : "+ex);
     
            } //some exception handling
            finally {
                stmt.close();
                currentCon.close();
            }
     
            return cars;
        }
    Pourquoi poser la question et pas simplement essayer?
    En effet je pourrais tenté le coup, mais je préfère connaître la bonne manière de faire. L'application sera censé gérer quelques centaines d'annonces (ce qui est difficile à simuler), si le ralentissement est proportionnel aux nombres d'annonces et que le site n'est pas optimisé dès le début je risque d'avoir des surprises

    En tout cas merci pour votre temps et vos conseil..(pour le vouvoiement/tutoiement je suis dans le flou donc je reste sur la manière formelle qui traduit également la différence de connaissance tel maître jedi/padawan.. vu la photo de profil on doit pas être loins d'avoir le meme âge.. j'aurais du continué les études ça aurait évité de vous/te déranger avec ces questions )

    Bonne journée..

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par crepy Voir le message
    en tout, le jsp généré par GlassFish fait 59K (et j'ai pas trouvé le html )..
    Heu, glassfish ne génère pas le jsp, le jsp c'est toi qui l'écrit, glassfish génère la page web finale (le html)
    en tout 6 connexions (chaque connexion est fermée à la fin du traitement)
    Cherche pas plus loin, tu gaspille inutilement les ressources:

    1) tu utilise 6 connexions alors qu'une seule aurait amplement suffit (imagine la charge de ton SGBD quand il se prendra 6 connexions * 200 requetes)
    2) utilise du connexion pooling pour éviter de devoir renégocier une connexion avec le SGBD pour chacun de tes clients. La négociation et l'authentification, suivant le SGBD, ca peux être long (sous oracle, compter une seconde pour établir une connexion, pour quelque millisecondes à exécuter la requête, que de temps perdu inutilement)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2010
    Messages : 37
    Points : 23
    Points
    23
    Par défaut Yep..
    Merci.. je vais donc me concentrer la dessus il me semple que c3p0 permet de gérer tout ça..

    (et pour l'histoire c'est index_jsp.java que génère GlassFish et qui me sert de refférence lorsqu'une erreur se produit.. j'avais mal vu, je croyais que c'était index.jsp. je suis donc toujours à la recherche du fichier html généré..)

    Bon week end

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par crepy Voir le message
    Merci.. je vais donc me concentrer la dessus il me semple que c3p0 permet de gérer tout ça..
    Les conteneur J2EE Font déjà du connection pooling, t'as juste à l'utiliser. PAs besoin d'injecter inutilement des librairires.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par crepy Voir le message
    (et pour l'histoire c'est index_jsp.java que génère GlassFish et qui me sert de refférence lorsqu'une erreur se produit.. j'avais mal vu, je croyais que c'était index.jsp. je suis donc toujours à la recherche du fichier html généré..)
    Il est dans le browser, tout simplement

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2010
    Messages : 37
    Points : 23
    Points
    23
    Par défaut dernier pt'it coup de pouce..
    Je pense que je doit pas etre loin de la solution.. j'ai un pool de conn que je ping parfaitement dans la GUI admin de GlassFish.. mais coté jsp je fait appel à chaque fois à la class ConnectionManager pour avoir une connection
    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
     
    public static Connection getConnection() {
            try {
                url = ":nono:";
     
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     
            try {
                con = DriverManager.getConnection(url,":nono:",":nono:");
     
            } catch (SQLException ex) {
                //ex.printStackTrace();
            }
            } catch(ClassNotFoundException e) {
                //System.out.println(e);
            }
     
            return con; }
    Mon seul soucis c'est de relier les deux.. j'ai parcourru pas mal le net et dans la plupart des cas les tuto ont l'air de gérer leur propre pool.. dans mon cas récuperer celui créé par le serveur à l'aide d'une commande dans la class ci-dessus serait la solution..

    Je continue parall`lement à chercher mais si t'as la réponse je prends..


  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2010
    Messages : 37
    Points : 23
    Points
    23
    Par défaut Bingo !!
    Voilà la class modifiée .. pourquoi se compliquer la vie ??..

    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
     
    public static Connection getConnection() throws SQLException{
            Context ctx = null;
            try {
                ctx = new InitialContext();
            } catch (NamingException ex) {
                Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
            }
            DataSource ds = null;
            try {
                ds = (DataSource) ctx.lookup("jdbc/kquiere_db");
            } catch (NamingException ex) {
                Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
            }
            Connection con=ds.getConnection();
     
            return con; }
    Il fallait donc utiliser Datasource pour avoir la connection et non DriverManager afin de pouvoir appeler le pool de GlassFish via Context lookup..

    Merci en tout cas.. le site est beaucoup plus rapide.. en espérant ne pas voir de mauvaise surprises plus tard, mais bon au moins maintenant je sais que je peux attaquer la conf du pool direct via GlassFish pour plus d'efficacité..


  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    juste comme ça (j'avais pas réagis sur le coup). Ne PAS utiliser jdbc/odbc en production sauf cas d'extrème nécessité. Ce driver est lent et pose tout plein de problème. Pour accéder à une base mysql, utiliser le driver mysql directement

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

Discussions similaires

  1. Erreur de chargement d'une JSP
    Par charoufa dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 02/11/2011, 20h29
  2. Comment optimiser la taille d'une animation ?
    Par infonetpclog dans le forum Flash
    Réponses: 2
    Dernier message: 18/07/2009, 12h56
  3. Optimiser le chargement d'une application
    Par stdebordeau dans le forum Windows Forms
    Réponses: 10
    Dernier message: 15/05/2009, 17h44
  4. comment optimiser la connexion dans une BdD
    Par ouadie99 dans le forum Accès aux données
    Réponses: 1
    Dernier message: 12/03/2008, 12h04
  5. Affichage de données au chargement d'une jsp
    Par xino972 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 24/06/2007, 11h39

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