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 :

Scope Application et mise en cache de données


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut Scope Application et mise en cache de données
    Bonjour à tous,

    Je suis en train de faire une application web pour une société immobilière en utilisant JSF. Jusqu'a aujourd'hui, tout marchait bien avec mes tests, methodes bien fonctionnelles, mais le drame est survenu quand au lieu de me servir de ma base de données de tests (avec quelques dizaines d'entrées) j'ai importé la base de données de la société (avec des dizaines de milliers d'entrées). Tout marche encore correctement, mais alors c'est d'une lenteur à tuer un escargot.

    Je me suis donc dit qu'il serait peut être bien de stocker les données en "cache" histoire de pas récupérer les valeurs en base de données a chaque fois. Etant encore une drouille en Hibernate et ses multi-niveaux de cache, j'ai pensé que je pourrais faire cela via un bean de scope Application. L'idée étant de créer par exemple un attribut "List<Bail> baux" contenant la liste de tous les baux (et y en a un paquet) et qu'on l'initialise via la base de données à la création du bean. Hélas ca marche pas exactement comme je le voudrais... D'où mes questions.

    -> A quel moment est créé un bean de scope "Application" exactement ? Dans ma tête, c'était au démarrage de l'application, pourtant j'ai constaté que je pouvais lancer mon serveur et naviguer sur certaines pages du site sans que le bean soit créé.

    -> Est-il détruit à un moment ? Je pensais que non, mais du coup, je n'arrive pas à expliquer qu'une fois ce bean créé, quand je vais sur un autre page appellant la liste passée en attribut du bean il interroge à nouveau la base de données...

    -> A tout hasard, vous connaissez une meilleure méthode pour stocker quelques Mo de données en cache sur un serveur Tomcat via JSF ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Par défaut
    Une liste static, dans une classe qui implémente ServletContextListener afin de la "populer" au lancement de ton application?

  3. #3
    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
    Citation Envoyé par Huojid Voir le message
    Bonjour à tous,


    -> A quel moment est créé un bean de scope "Application" exactement ? Dans ma tête, c'était au démarrage de l'application, pourtant j'ai constaté que je pouvais lancer mon serveur et naviguer sur certaines pages du site sans que le bean soit créé.
    le bean est créée par JSF à la première utilisation, première apparition dans une vue (appel avec EL). C'est donc , normal ue le bean ne soit pas créer, si les pages ne s'en servent pas.
    Citation Envoyé par Huojid Voir le message
    -> Est-il détruit à un moment ? Je pensais que non, mais du coup, je n'arrive pas à expliquer qu'une fois ce bean créé, quand je vais sur un autre page appellant la liste passée en attribut du bean il interroge à nouveau la base de données...
    le bean est partagé par toutes les sessions, il est détruits par le gabrbage collector.

  4. #4
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut
    Merci pour vos réponses.

    J'ai essayé la liste statique dans un ContextListener, ca se remplit bien dès le lancement de Tomcat, mais apres pas mieux que le bean de scope Application, encore des appels en base de données. Du coup, j'aimerais pousser mes tests plus loin, histoire d'être sur que ca vient pas d'ailleurs (on sait jamais).

    Vous savez comment faire pour suivre les actions du Garbage Collector ? Genre loguer les objets qu'il détruit. Et s'il est possible de proteger une Class contre le garbage collector ? (histoire qu'elle soit pas détruite...).

  5. #5
    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
    Citation Envoyé par Huojid Voir le message
    Merci pour vos réponses.

    J'ai essayé la liste statique dans un ContextListener, ca se remplit bien dès le lancement de Tomcat, mais apres pas mieux que le bean de scope Application, encore des appels en base de données. Du coup, j'aimerais pousser mes tests plus loin, histoire d'être sur que ca vient pas d'ailleurs (on sait jamais).

    Vous savez comment faire pour suivre les actions du Garbage Collector ? Genre loguer les objets qu'il détruit. Et s'il est possible de proteger une Class contre le garbage collector ? (histoire qu'elle soit pas détruite...).
    le GC ne détruit un objet que s'il n'est plus utilisable, ce n'est pas là le problème, et on générale on se soucis plus d'objets pas détruits à temps que d'objets détruis.

    tu fais comment l'appel à la base? dans un getter..?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Par défaut
    Si tu fais un simple get sur ta liste je ne vois pas en effet pourquoi il y aurait un accès en bd?

    A titre d'exemple, un petit bout de code qui répond plus ou moins à ta problematique.
    Dans mon cas j'ai besoin d'une liste des pays (qui est en base) pour faire de l'auto complete.

    L'initialisation est faite via listener dans la méthode contextInitialized.
    Par la suite avec un getter les autres classes récupèrent la liste,Il n'y a donc qu'un seul appel vers la base, dans contextInitialized.

    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 fr.test.utils;
     
    import java.util.List;
     
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
     
    import fr.test.metier.bean.Pays;
    import fr.test.metier.impl.ManagerFactory;
    import fr.test.metier.manager.IGestPays;
     
    public class Referentiel implements ServletContextListener {
     
    	private static List<Pays> listePays;
     
     
    	public void contextDestroyed(ServletContextEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	public void contextInitialized(ServletContextEvent arg0) {
    		//chargement de la liste des pays
    		Referentiel.listePays=this.getGestPays().listerPays();
     
    	}
     
    	public static void setListePays(List<Pays> listePays) {
    		Referentiel.listePays = listePays;
    	}
     
    	public static List<Pays> getListePays() {
    		return listePays;
    	}
     
     
    	/**
             * 
             * @return le gestionnaire pays
             */
    	private IGestPays getGestPays() {
     
    		return ManagerFactory.getInstance().createGestPays();
    	}
     
    }

  7. #7
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut
    Je fais pratiquement cela en effet.

    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
    package util;
     
    import java.util.List;
     
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
     
    import dao.BailDAO;
     
    import model.Bail;
     
     
    public class ContextListener implements ServletContextListener {
     
    	private static List<Bail> baux;
     
    	public void contextDestroyed(ServletContextEvent arg0) {
    		System.out.println("********* CONTEXTE DETRUIT *****************************");
     
    	}
     
    	public void contextInitialized(ServletContextEvent arg0) {
    		System.out.println("********* CONTEXTE INITIALISE ****************************");
     
    		BailDAO bDAO = new BailDAO();
    		List<Bail> baux = bDAO.getBy("id", "asc");
    		ContextListener.setBaux(baux);
     
    	}
     
    	public static List<Bail> getBaux() {
    		return baux;
    	}
     
    	public static void setBaux(List<Bail> baux) {
    		ContextListener.baux = baux;
    	}
     
    }
    Coté DAO, ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public java.util.List<model.Bail> getBy(String field, String order) {
    		String q = "select b from model.Bail b order by "+field+" "+order;
    		javax.persistence.Query query = getSession().createQuery(q);
    		return query.getResultList();
    	}
    Puis dans mon bean Application "siteBean" gérant mon site :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public List<Bail> getBails() {
    		return ContextListener.getBaux();
    	}
    Et ensuite, dans les dataTable, j'ai des EL : value="#{siteBean.bails}"

    Pourtant, je peux vous assurer qu'a chaque page avec une dataTable, ca crache sec niveau "select" avec Hibernate (j'ai été obligé de deployer un logger car mes "system.out" se perdait dans la masse).

    Apres, je tiens à préciser qu'un object "Bail" fait référence à d'autres objets stockés en base de données (notamment des "Lot"s). Et dans l'affichage de ma table, je mets des informations tirées des objets "Lot", je me demande donc s'il fait pas un "select" sur le bail dans le but de charger les objets "Lot" associées...

    Voili voila.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/04/2011, 15h32
  2. Mise en cache de données via CacheManager
    Par Ghunter59 dans le forum Android
    Réponses: 0
    Dernier message: 24/06/2010, 16h23
  3. Comment forcer la Mise en cache des données ?
    Par sybcat dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 12/03/2010, 08h16
  4. Mise en cache de données
    Par moumoune65 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 20/10/2007, 00h13
  5. Création d'un cache, mise en cache de donnée indexé
    Par *alexandre* dans le forum Persistance des données
    Réponses: 6
    Dernier message: 19/05/2007, 15h43

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