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 :

Lenteur au niveau du filtre


Sujet :

Servlets/JSP Java

  1. #1
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut Lenteur au niveau du filtre
    Bonjour

    J'utilise un filtre pour lister des données provenant de ma BD.

    Le problème est que lorsque j'ajoute de nouvelles données dans la BD et que j'actualise la page, ces nouvelles données ne s'affichent pas ma liste. Et même quand je redémarre le navigateur ou le serveur tomcat, j'ai toujours le même problème. Je dois attendre quelques heures pour que ma liste s'actualise.

    Voici ma Class PrechargementFilter

    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
     
    package filters;
     
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
     
     
    import beans.Offre;
    import dao.DAOFactory;
    import dao.OffreDao;
     
    public class PrechargementFilter implements Filter {
        public static final String CONF_DAO_FACTORY      = "daofactory";
     
        public static final String ATT_SESSION_OFF   = "offres";
     
     
        private OffreDao          offreDao;
     
        public void init( FilterConfig config ) throws ServletException {
            /* Récupération d'une instance de nos DAO Client et Commande */
            this.offreDao = ( (DAOFactory) config.getServletContext().getAttribute( CONF_DAO_FACTORY ) ).getOffreDao();
        }
     
        public void doFilter( ServletRequest req, ServletResponse res, FilterChain chain ) throws IOException,
                ServletException {
     
            /* Cast de l'objet request */
            HttpServletRequest request = (HttpServletRequest) req;
     
            /* Récupération de la session depuis la requête */
            HttpSession session = request.getSession();
     
            if ( session.getAttribute( ATT_SESSION_OFF ) == null ) {
                /*
                 * Récupération de la liste des clients existants, et enregistrement
                 * en session
                 */
                List<Offre> listeOffres = offreDao.lister();
                Map<Long, Offre> mapOffres = new HashMap<Long, Offre>();
                for ( Offre offre : listeOffres ) {
                    mapOffres.put( offre.getId(), offre );
                }
                session.setAttribute( ATT_SESSION_OFF, mapOffres );
     
            }
     
            /* Pour terminer, poursuite de la requête en cours */
            chain.doFilter( request, res );
        }
     
        public void destroy() {
        }
    }
    Voici ma page jsp:

    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
    <%-- Parcours de la Map des offres en session, et utilisation de l'objet varStatus. --%>
                    <c:forEach items="${ sessionScope.offres }" var="mapOffres" varStatus="boucle">
                         <div class="${boucle.index % 2 == 0 ? 'indent3' : 'indent5'}">
                                                                            <div class="row">
                                                                                <div class="container bg">
                                                                                     <div class="container bg1">
                                                                                        <div class="container bg2">
                                                                                            <div class="container bg3">
                                                                                                <div class="col-1"><c:out value="${ mapOffres.value.dateLimite }"/></div>
                                                                                                <div class="col-2"><a href="<c:url value="/pages/offres/cosef/${ mapOffres.value.poste }"/>" target="blank"><c:out value="${ mapOffres.value.poste }"/><span></span> </a></div>
                                                                                                <div class="col-3"><c:out value="${ mapOffres.value.nomEmploy }"/></div>
                                                                                                <div class="col-4"><c:out value="${ mapOffres.value.typeOffre }"/></div>
                                                                                                <div class="col-5" ><a class ="voir_offre" href="<c:url value="/pages/offres/cosef/${ mapOffres.value.nomOffre }"/>" target="blank">Voir l'offre</a></div>                                   
                                                                                            </div>
                                                                                        </div>
                                                                                    </div>
                                                                                </div>       
                                                                            </div>
                                                                        </div>
     
                    </c:forEach>
    D'où peut venir le problème?

  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
    Vu que tu stocke cette information dans la session de l'utilisateur, ces données restent tant que la session reste active. Arrêter tomcat n'invalide pas les sessions, elles sont serializées sur le disque puis restaurées au démarrage. Ta solution la plus simple serait de centraliser ce cache au niveau applicatif (et non pas au niveau session) et de le remettre à 0 quand tu modifie des données:
    Un truc dans ce gout là:

    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 static final String ATT_APP_OFF   = "com.company.offres.cache";
        public static final String ATT_REQUEST_OFF= "offres";
        public void doFilter( ServletRequest req, ServletResponse res, FilterChain chain ) throws IOException,
                ServletException {
     
            /* Cast de l'objet request */
            HttpServletRequest request = (HttpServletRequest) req;
     
            Map<Long, Offre> mapOffres = (Map<Long, Offre>)getServletContext().getAttribute( ATT_APP_OFF); // récupération de l'application scope
     
            if (mapOffres == null ) {//application scope
                /*
                 * Récupération de la liste des clients existants, et enregistrement
                 * en session
                 */
                List<Offre> listeOffres = offreDao.lister();
                mapOffres = new HashMap<Long, Offre>();
                for ( Offre offre : listeOffres ) {
                    mapOffres.put( offre.getId(), offre );
                }
                getServletContext().setAttribute( ATT_APP_OFF, mapOffres ); // on stocke
            }
            request.setAttribute(ATT_REQUEST_OFF, mapOffres); // request scope pour la jsp
            /* Pour terminer, poursuite de la requête en cours */
            chain.doFilter( request, res );
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <%-- Parcours de la Map des offres en request, et utilisation de l'objet varStatus. --%>
                    <c:forEach items="${ requestScope.offres }" var="mapOffres" varStatus="boucle">

  3. #3
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Ok je vois. Mais au niveau de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<Long, Offre> mapOffres = (Map<Long, Offre>)getServletContext().getAttribute( ATT_APP_OFF);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getServletContext().setAttribute( ATT_APP_OFF, mapOffres ); // on stocke
    J'ai dû rajouter request.getServletContext, ce qui me donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<Long, Offre> mapOffres = (Map<Long, Offre>)request.getServletContext().getAttribute( ATT_APP_OFF);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getServletContext().setAttribute( ATT_APP_OFF, mapOffres ); // on stocke
    Et ça marche....mais à moitié; car maintenant les nouvelles données s'affichent après le redémarrage du serveur.

    C'est mieux que ce que j'avais au début; mais est-ce normal?

  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
    Comme je l'ai dit, tu dois remettre ce cache à 0 quand tu modifie des données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getServletContext().removeAttribute( ATT_APP_OFF )

  5. #5
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Merci beaucoup ça marche.

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

Discussions similaires

  1. [Toutes versions] Gestion des parenthèses au niveau des filtres des affichages
    Par nash17 dans le forum SharePoint
    Réponses: 5
    Dernier message: 27/09/2013, 17h08
  2. lenteur au niveau d'un requete selection
    Par molo1987 dans le forum Requêtes
    Réponses: 12
    Dernier message: 18/06/2012, 17h18
  3. [OpenSceneGraph] Lenteur au niveau du rendu
    Par Quanteek dans le forum OpenSceneGraph
    Réponses: 9
    Dernier message: 11/12/2008, 15h27
  4. [SSRS][SSAS] Filtre au niveau de rapports
    Par elkhanssaa dans le forum SSRS
    Réponses: 1
    Dernier message: 23/05/2008, 13h20
  5. Lenteur execution filtre
    Par fantagaro dans le forum Cognos
    Réponses: 4
    Dernier message: 12/02/2008, 09h55

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