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

Java Discussion :

Chargement des données depuis la BD


Sujet :

Java

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Chargement des données depuis la BD
    Bonjour a tous,

    dans le cadre de mon PFE, je dois développer une application qui manipule un volume énorme de données. Comme environnement, j'ai opté pour Spring 3, hibernate4 , JSF 2 et primefaces.

    Mon problème est , en fait, je dois afficher un truc énorme. au début j'ai voulu faire des "tree". mais avec une profondeur = 3 ça ne marchait pas comme voulu. donc j'ai choisi la dataTable en particulier celle la http://www.primefaces.org/showcase-l...bleComplex.jsf

    ça marche à merveille. Mais j'ai toujours le même problème de lenteur de chargement de données.
    SVP, est ce que vous avez des suggestions pour remédier a ce problème

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Bonjour, combien de lignes souhaites tu charger en une seule fois? utilises tu le système de pagination des datatables? ton lien n'est pas accessible en passant...

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    bonjour

    il faut que je charge a peu prés 8000 lignes. oui j'ai utilisé un système de pagination mais mon problème persiste toujours.

    PS: le lien dirige vers la "complex datatable" de primefaces.

  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Bonjour,
    En effet 8000 enregistrements,ça commence à bien le faire . Sans aucun code de ta part, je vais te proposer une solution théorique que nous avons implémentée dans notre framework J2EE actuel, nous utilisons struts2 avec le composant DisplayTag. Dans notre framework lorsqu'un tableau peut potentiellement contenir un volume assez important, il est possible de paramétrer un chargement à la demande sur le n° de page.En d'autres termes l'ordre de select ne rapatrie que les enregistrements concernant la page.Cette méthode donne l'avantage d'un chargement rapide de la première page,mais d'un temps d'attente à chaque click sur une page, ce qui est toujours mieux qu'un chargement en une fois qui peut générer un temps bien considérable.Après y'a peut être moyen d'optimiser également ta requête d'extraction de données...

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

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Sans avoir de code, effectivement difficile de t'aider. Et trouver les raisons de problèmes de perfo, ce n'est jamais simple.
    Une idée toute bête au cas où : tu ne serais pas en mode debug pour les logs ? Parce que si c'est le cas, fais un test en te mettant en niveau supérieur ^^

  6. #6
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    je suis desolée si j'ai pas bien precisé le probleme.
    je vous faispart de mon code. le dao en question est
    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
     
    package com.otv.dao;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import org.hibernate.SessionFactory;
     
    import com.otv.model.Current;
     
    public class CurrentDAO implements ICurrentDAO{
     
    	private SessionFactory sessionFactory;
     
    	public SessionFactory getSessionFactory() {
    		return sessionFactory;
    	}
     
    	public void setSessionFactory(SessionFactory sessionFactory) {
    		this.sessionFactory = sessionFactory;
    	}
     
     
    	public List <Current> listAll()
    	{
    		List<Current> list= new ArrayList<Current>();
    		List<Object> maListe= new ArrayList<Object>();
    		maListe= getSessionFactory().getCurrentSession().createSQLQuery("select consi, nombsc, nombts, nomsite, lac, ci, nomcell from vcurrentcell").list();
    		for (int i=0; i<maListe.size(); i++)
    		{
    			Object obj[] = (Object[]) maListe.get(i);
    			Current c = new Current();
    			c.setConsi(obj[0].toString());
    			c.setNomBsc(obj[1].toString());
    			c.setNomBts(obj[2].toString());
    			c.setNomSite(obj[3].toString());
    			c.setLac(obj[4].toString());
    			c.setCi(Integer.parseInt(obj[5].toString()));
    			c.setNomCell(obj[6].toString());
    			list.add(c);
    		}
     
     
    		 return list;
    	}
     
    }
    la managed bean
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    package com.otv.managed.bean;
     
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ManagedProperty;
    import javax.faces.bean.SessionScoped;
    import javax.faces.component.UIComponent;
    import javax.faces.context.FacesContext;
     
    import com.otv.model.Current;
    import com.otv.model.CurrentBsc;
    import com.otv.service.ICurrentBscService;
    import com.otv.service.ICurrentService;
    import com.otv.service.Icolumns_keyService;
     
     
    @ManagedBean(name="tableMB")
    @SessionScoped
    public class TableBean {
     
    	@ManagedProperty(value="#{CurrentService}")
    	ICurrentService currentService;
        private List<Current> current;  
        private Current[] selected;
        private List<Current> filtred;
        private Current c;
        private Current selectedCar;
     
        public ICurrentService getCurrentService() {
    		return currentService;
    	}
     
    	public void setCurrentService(ICurrentService currentService) {
    		this.currentService = currentService;
    	}
     
    	public TableBean() {
     
    	}
     
    //    private void addcurrent() {
    //    	current = new ArrayList<Current>();
    //        current= getCurrentService().ListeAll();
    //    }
     
     
     
        public List<Current> getCurrent() {
    //		return current;
        	return getCurrentService().ListeAll();
    	}
     
    	public void setCurrent(List<Current> current) {
    		this.current = current;
    	}
     
    	public Current[] getSelected() {
    		return selected;
    	}
     
    	public void setSelected(Current[] selected) {
    		this.selected = selected;
    	}
     
    	public List<Current> getFiltred() {
    		return filtred;
    	}
     
    	public void setFiltred(List<Current> filtred) {
    		this.filtred = filtred;
    	}
     
    	public Current getC() {
    		return c;
    	}
     
    	public void setC(Current c) {
    		this.c = c;
    	}
     
    	public Current getSelectedCar() {
    		return selectedCar;
    	}
    	public void setSelectedCar(Current selectedCar) {
    		this.selectedCar = selectedCar;
    	}
     
     
    }
    et finalement la page jsf
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <html xmlns="http://www.w3.org/1999/xhtml"  
         xmlns:h="http://java.sun.com/jsf/html" 
         xmlns:f="http://java.sun.com/jsf/core" 
         xmlns:p="http://primefaces.org/ui">  
     
     <h:head><title>Welcome to JSF_PrimeFaces_Spring_Hibernate Project</title></h:head>  
     <body>  
     <f:view>  
         <h:form id="form">  
     
        <p:dataTable var="car" value="#{tableMB.current}" rowKey="#{car.nomCell}" paginator="true" rows="20"  
                    selection="#{tableMB.selected}" selectionMode="single" filteredValue="#{tableMB.filtred}" id="carsTable">  
     
            <p:ajax event="rowSelect" update=":form:display" oncomplete="carDialog.show()" />  
     
            <f:facet name="header">  
                List of Cells  
            </f:facet>  
     
            <p:column headerText="constructeur" sortBy="#{car.consi}" filterBy="#{car.consi}" id="model">  
                #{car.consi}  
            </p:column>  
     
            <p:column headerText="BSC" sortBy="#{car.nomBsc}" filterBy="#{car.nomBsc}" id="year">  
                #{car.nomBsc}  
            </p:column>  
     
            <p:column headerText="Cellules" sortBy="#{car.nomCell}" filterBy="#{car.nomCell}" id="manufacturer">  
                #{car.nomCell}  
            </p:column> 
            <f:facet name="footer">  
                <p:commandButton value="View" icon="ui-icon-search"  
                            update=":form:display" oncomplete="carDialog.show()"/>  
            </f:facet>  
        </p:dataTable>  
     
     <p:dialog header="Car Detail" widgetVar="carDialog" resizable="false"  
                  width="200" showEffect="explode" hideEffect="explode">  
     
            <h:panelGrid id="display" columns="2" cellpadding="4">  
     
     
                <h:outputText value="consi:" />  
                <h:outputText value="#{tableMB.selectedCar.consi}" id="model"/>  
     
                <h:outputText value="BSC:" />  
                <h:outputText value="#{tableMB.selectedCar.nomBsc}" id="year"/>  
     
                <h:outputText value="Cellules:" />  
                <h:outputText value="#{tableMB.selectedCar.nomCell}" id="manufacturer"/>  
     
     
            </h:panelGrid>  
        </p:dialog>  
     
    </h:form> 
     </f:view>  
    </body>    
    </html>
    et je tiens a vous remercier infiniment pour votre aide !

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    j'ai oublié un truc! y a un collègue qui m'a suggéré de paramétrer la requête SQl de façon a ce que le chargement soit limité a un nombre bien défini de ligne (exemple 20 lignes) . Ceci en utilisant le "rownum" d'oracle (parce que OUI il s'agit d'une BD Oracle). donc je vois pas comment modifier la page .xhtml pour qu'a chaque saut de page on charge les 20 nouvelles lignes.

    c mon premier gros projet et première expérience avec les outils cités précédemment

  8. #8
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Le mécanisme s'appelle.
    Essaies un peu de suivre ce lien

  9. #9
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    petite Mise a jour

    j'ai essayé le chargement par "lot" depuis la bd en utilisant setMaxResults et setFirstResult. sauf ke g po su comment incrementer leurs variables. pour le moment je n'affiche que 20 lignes et c tout. les bouttons de pagination sont desactivés.

    modification niveau dao
    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
    public List<Current> scroll(int pageNum, int pageSize) {
    		// verif pagenum, pagesize != 0
     
    		List<Current> list = new ArrayList<Current>();
    		List<Object> maListe = new ArrayList<Object>();
     
    		//if (pageNum!=0 && pageSize!=0)
    		maListe= getSessionFactory()
    				.getCurrentSession()
    				.createSQLQuery(
    						"select consi, nombsc,nombts, nomsite, lac, ci, nomcell from vcurrentcell")
    				.setMaxResults(pageSize).setFirstResult(pageNum).list();
    		for (int i = 0; i < maListe.size(); i++) {
     
    			// nombts, nomsite, lac, ci,
    			Object obj[] = (Object[]) maListe.get(i);
    			Current c = new Current();
    			c.setConsi(obj[0].toString());
    			c.setNomBsc(obj[1].toString());
    			c.setNomBts(obj[2].toString());
    			c.setNomSite(obj[3].toString());
    			c.setLac(obj[4].toString());
    			c.setCi(Integer.parseInt(obj[5].toString()));
    			c.setNomCell(obj[6].toString());
    			list.add(c);
    		}
    		return list;	}
    Images attachées Images attachées  

  10. #10
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Bonjour, si tu suis le tutoriel que je t'ai envoyé, il te propose plutôt d'aller chercher toutes les lignes qui seront en mémoire, mais dans le paramétrage des attributs de ton tableau, tu lui précises bien que c'est un chargement paresseux.Et ce sera donc à lui de gérer ce mécanisme. L'idée que tu tentes d'appliquer est certes la plus optimisée, mais je l'ai appliquée dans un environnement Struts2, et c'est un peu plus complexe pour toi de te caler là dessus.Peux tu plutôt partir sur l'exemple avec Primefaces que je t'ai transmis?

  11. #11
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut probleme resolu
    Bonjour
    j'ai fini par trouvé la solution!
    j'ai suivi ce petit tuto http://www.ke-cai.net/2011/10/pagina...l-loading.html


    j'espere que ca va aidé quelqu'un. Merci a tous et a tres bientot

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

Discussions similaires

  1. Chargement des données depuis la BD
    Par nadou06 dans le forum Spring
    Réponses: 1
    Dernier message: 12/12/2012, 10h37
  2. Réponses: 1
    Dernier message: 25/11/2012, 14h11
  3. Linq to Entity Chargement des données depuis SqlServer 2008
    Par ddneuf dans le forum Entity Framework
    Réponses: 0
    Dernier message: 09/10/2012, 13h18
  4. Récupérer des données depuis un autre site
    Par cchampion2fr dans le forum Langage
    Réponses: 31
    Dernier message: 30/10/2006, 10h05
  5. [CR7]Actualisation des données depuis VB
    Par elifqaoui dans le forum SDK
    Réponses: 4
    Dernier message: 24/11/2003, 13h44

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