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

JSF Java Discussion :

[RichFaces] Optimisation : ExtendedDataTable et NamedQuery


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2008
    Messages : 58
    Par défaut [RichFaces] Optimisation : ExtendedDataTable et NamedQuery
    Bonjour à tous,

    j'utilise JSF1.2, Facelet 1.1.14, RichFaces 3.3.2 sur glassfish 2.1.

    Pour lister toute une série d'enregistrements, j'utilise un extendedDataTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <rich:extendedDataTable rows="20" noDataLabel="#{activitiesBundle['tab.noDataLabel']}" width="auto" value="#{ActivitiesMB.activitiesDataModel}" selection="#{ActivitiesMB.selection}" selectionMode="multi" var="fant" id="table" rowKeyVar="row">
    En suite, j'utilise un dataScroller pour paginer ce tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <rich:datascroller align="center" for="table" page="#{ActivitiesMB.numPage}"/>
    Tout ceci marche très bien mais pour créer mon datamodel je fais appel à des EJB censés récupérer tous mes enregistrements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @NamedQuery(name = "Activities.findAll", query = "SELECT a FROM Activities a", hints={@QueryHint(name="toplink.refresh", value="true")})
    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
     
    public ExtendedTableDataModel<Activities> getActivitiesDataModel() {
                this.listAct = this.activitiesDAO.findAll(); //appelle simple a la NamedQuery défini au dessus
                //if (dataModel == null) {
                        dataModel = new ExtendedTableDataModel<Activities>(new DataProvider<Activities>(){
     
                                private static final long serialVersionUID = 5054087821033164847L;
     
                                public Activities getItemByKey(Object key) {
                                        for(Activities a : listAct){
                                                if (key.equals(getKey(a))){
                                                        return a;
                                                }
                                        }
                                        return null;
                                }
     
                                public List<Activities> getItemsByRange(int firstRow, int endRow) {
                                        return listAct.subList(firstRow, endRow);
                                }
     
                                public Object getKey(Activities item) {
                                        return item.getId();
                                }
     
                                public int getRowCount() {
                                        return listAct.size();
                                }
     
                        });
                //}
                return dataModel;
    	}
    Ma question est simple : Dans le cas ou j'ai, imaginons, 100 000 enregistrements, mon EJB va me créer une liste de 100 000 objets ? Dans ce cas, existe-t-il un moyen de ne récupérer que les enregistrements à afficher histoire de décharger le serveur et ceci en prenant en compte les tris et filtres du extendedDataModel ?

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu peux récupérer les résultats bloc par bloc ne pas prendre tout d'un coup.
    Par contre le filtre de la dataTable ne fonctionne qu'avec les résultats déjà présents dans la webapp.
    une solution simple serait de faire plusieurs appels pour construite la liste, la solution plus compliqué serais de faire un scroller personnalisé ou redéfinir celui de la dataTable pour scroller sur les résultats directement de la base de données.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2008
    Messages : 58
    Par défaut
    Dans le cas où l'on peut faire un tri et récupéré simplement les données à afficher, le filtre ne sera pas très utile, donc je peux très bien m'en débarrasser.

    Sachant que je récupère a chaque fois les données à partir de ma DB et non du cache, il est impératif que je me limite au données à afficher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hints={@QueryHint(name="toplink.refresh", value="true")}
    Le serveur risque d'implosé si je recréé une liste de 100k objets à chaque changement de page.

    Comment puis-je créer mon propre datascroller ?

    J'ai bien trouvé des approches comme ici, mais il me semble qu'il utilise Seam :
    Page1
    Page2

    Et une autre qui a l'air plutôt sympa mais qui utilise encore Seam :
    Page1

    Je ne connais rien a Seam, est-ce obligatoire de travailler sur JBoss pour l'utiliser ? Pourrais-je vraiment régler mes problèmes avec l'une de ces solutions ?

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu ne veux pas charger le serveur web ou c'est le transfert de données entre les deux??

    pour le scroller, tu dois d'abord trouver le nombre total de résultat, calculer le nombre de pages et définir le dataScroller avec le binding et peu être ajouter un a4j:support, tu trouvera les évènements sur la doc. et coté JPA modifier la requete pour prendre que x lignes.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2008
    Messages : 58
    Par défaut
    En clair je cherche à faire de la "True pagination", une espèce de BufferedDataTable qui ne charge QUE les données affichées et non comme c'est le cas, de base, la liste de TOUS les enregistrements...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2008
    Messages : 58
    Par défaut
    Bon je laisse tombé cette solution pour le moment !

    Si je trouve un de ces 4 une solution a ce problème, je reviendrai la poster ici.

Discussions similaires

  1. Problème Richfaces <rich:extendedDataTable>
    Par cyranno dans le forum JSF
    Réponses: 9
    Dernier message: 05/07/2011, 16h04
  2. [richfaces] modalpanel et extendedDataTable
    Par totofe dans le forum JSF
    Réponses: 7
    Dernier message: 10/09/2009, 17h37
  3. Réponses: 0
    Dernier message: 23/07/2009, 16h49
  4. [RichFaces] - ExtendedDataTable et SubTable
    Par djalouk dans le forum JSF
    Réponses: 2
    Dernier message: 30/06/2009, 17h01
  5. Richfaces: Optimisation des reRender
    Par davidovitch dans le forum JSF
    Réponses: 33
    Dernier message: 29/04/2009, 14h34

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