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

ASP.NET Discussion :

Lazy Load et gestion de cache


Sujet :

ASP.NET

  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut Lazy Load et gestion de cache
    Bonjour à tous,

    Pour le chargement des données (de mes objets) dans un website ayant une architecture de Type 3-Tier, je voudrais utiliser le mécanisme de Lazy Load, mais j'aurais au préalable quelques questions :

    - Est ce une bonne méthode pour gérer un cache ASP.NET (côté serveur), de faire un chargement en mode Lazy ? (D'ailleurs si vous avez une ou deux bonnes pratiques pour la gestion de cache je suis preneur).

    - Ensuite dans la mise en place de ce mécanisme (de manière manuel), il y a quelque chose qui m'échappe, typiquement la structure est de ce type :


    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
    public class Customer 
        { 
            FileCollection m_oFiles = null; 
            public FileCollection Files 
            { 
                get 
                { 
                    if (m_oFiles == null) 
                    { 
                        m_oFiles = new FileCollection(); 
                        m_oFiles.OpenForCustomer(Id); 
                    } 
                    return m_oFiles; 
                } 
            }
    Ca nous oblige à avoir dans l'objet une méthode qui appel la couche métier, non ? Sinon ou mettre la méthode OpenForCustomer ?

    Par ailleurs est il possible de faire du Lazy Loading que sur une partie des données (si on a Id, Title et List<Fournisseur>) le faire que sur la liste de fournisseur, est ce que c'est une bonne implémentation du DP ?

    Merci d'avance

  2. #2
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    perso, j'ai mis ca en place pour une appli, ca marche pas mal-> lazy load de donnees depuis un service web, puis mise en cache cote serveur

    Par contre, le lazy loading en vas pas te permettre de faire une mise en cache, juste de ne pas charger tous les fichiers si tu veux juste lister les clients

    Citation Envoyé par rad_hass Voir le message
    Ca nous oblige à avoir dans l'objet une méthode qui appel la couche métier, non ? Sinon ou mettre la méthode OpenForCustomer ?

    Par ailleurs est il possible de faire du Lazy Loading que sur une partie des données (si on a Id, Title et List<Fournisseur>) le faire que sur la liste de fournisseur, est ce que c'est une bonne implémentation du DP ?
    oui, il va falloir que l'objet connaisse la couche metier, ou sinon, tu ne vas pas faire du lazy loading, tu vas appeler ta couche metier pour demander une nouvelle FileCollection

    moi, je ferais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public FileCollection Files{ 
                get{ 
                    if (m_oFiles == null) { 
                        m_oFiles = FileFactory.OpenForCustomer(Id); 
                    } 
                    return m_oFiles; 
                } 
            }
    Mais c'est plus une question de gout

    Apres, ca ne me choque pas que tu fasses du lazy loading sur filecollection, mais que tu recuperes toujours Id et Title...Deja parce que si tu n'as pas Id, tu risques d'avoir du mal a retrouver les fichiers ...et en plus parce que recuperer Title, ca doit pas couter bien cher, et que le but est bien (dans to cas) d'economiser le chargement de donnees couteuses...

    Ce que tu veux faire, c'est ca, en fait :
    http://en.wikipedia.org/wiki/Lazy_loading#Ghost

    donc, oui, c'est valide comme implementation...apres, on peut aller demander a Martin Fowler

  3. #3
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    Desole de mimiser dans cette discussion, mais qu'est ce que le lazy load ? est a quoi ca sert ?

    J'ai essayé de chercher sur notre ami à tous google, mais je n'arrive toujours pas à comprendre ?!?

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Merci beaucoup pour cette réponse

    Citation Envoyé par pvialatte Voir le message
    perso, j'ai mis ca en place pour une appli, ca marche pas mal-> lazy load de donnees depuis un service web, puis mise en cache cote serveur
    Le service web a un rôle dans l'implémentation ou c'est seulement ton architecture ou encore les deux ?

    Citation Envoyé par pvialatte Voir le message
    oui, il va falloir que l'objet connaisse la couche metier, ou sinon, tu ne vas pas faire du lazy loading, tu vas appeler ta couche metier pour demander une nouvelle FileCollection

    moi, je ferais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public FileCollection Files{ 
                get{ 
                    if (m_oFiles == null) { 
                        m_oFiles = FileFactory.OpenForCustomer(Id); 
                    } 
                    return m_oFiles; 
                } 
            }
    Mais c'est plus une question de gout
    J'avoue ne pas utiliser le motif Factory, mais l'association me parait vraiment intéressante, c vachement sexy comme implémentation.

    Citation Envoyé par pvialatte Voir le message
    Ce que tu veux faire, c'est ca, en fait :
    http://en.wikipedia.org/wiki/Lazy_loading#Ghost

    donc, oui, c'est valide comme implementation...apres, on peut aller demander a Martin Fowler
    Avec plaisir, ça fera une belle discussion (écoute dans mon cas )

    Encore merci pour cette belle réponse.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par topolino Voir le message
    Desole de mimiser dans cette discussion, mais qu'est ce que le lazy load ? est a quoi ca sert ?
    C'est une technique qui permet de retarder le chargement des données jusqu'au moment où on en a besoin
    Regarde le lien wikipedia donné par pvialatte


    Pour répondre à la question initiale : si tu veux "lazy loader" des objets métier de façon générique, sans avoir besoin de savoir exactement comment ils marchent, il suffit de créer une interface qui sera implémentée par tous les objets qui supportent ce mode de chargement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface ILazyLoadable
    {
        void InitializeObject(object[] parameters);
        bool IsInitialized { get; }
    }
    Evidemment pour le passage de paramètres c'est pas super pratique, mais la généricité à un prix... On pourrait aussi utiliser un IDictionary<string, object> à la place de object[], ça faciliterait un peu la récupération des paramètres.

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Citation Envoyé par topolino Voir le message
    Desole de mimiser dans cette discussion, mais qu'est ce que le lazy load ? est a quoi ca sert ?

    J'ai essayé de chercher sur notre ami à tous google, mais je n'arrive toujours pas à comprendre ?!?
    le Lazy loading est un design pattern qui est utilisé dans certains ORM comme hibernate (nhibernate), entity framework (me semble ) ... Ca consiste à retarder la récupération d'une données au moment de son utilisation et donc d'éviter de charger des données inutile qui vont diminuer les performances pour rien et puis ça améliore les temps de réponse (mais ça augmente le nombre de requête).

    A l'inverse on a l'eager loading qui lui consiste à tout récupérer d'un coup ...

  7. #7
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    Qu un connait il un tutorial en francais car je pige que dal a ce design pattern.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par topolino Voir le message
    Qu un connait il un tutorial en francais car je pige que dal a ce design pattern.
    c'est pourtant pas très compliqué... qu'est-ce que tu comprends pas ? le code ne t'aide pas à comprendre ?

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Citation Envoyé par topolino Voir le message
    Qu un connait il un tutorial en francais car je pige que dal a ce design pattern.
    Si tu n'utilise pas ce DP, tu charge ton objet dés que tu l'appel la première fois et ceux entièrement (ou partiellement mais là faut le gérer au niveau de bll), si tu récupère aussi en même temps les objets liés, tu fais du Eager loading (donc tu récupère tt en même temps).

    Par contre si tu utilise ce DP, tu te dis je ne charge que partiellement mon objet (Article par exemple) au premier appel (je récup que l'ID par exemple) et si j'ai besoin d'une Description ou un Fichier lié, tu le load lors de l'appel, quand tu fait monArticle.Desc, et dans le code ça se gére avec le fameux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(Desc == null)
      ArticleFactory.loadDesc(Id)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(Desc == null)
      _oFile.OpenFile(Id)

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Pour répondre à la question initiale : si tu veux "lazy loader" des objets métier de façon générique, sans avoir besoin de savoir exactement comment ils marchent, il suffit de créer une interface qui sera implémentée par tous les objets qui supportent ce mode de chargement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface ILazyLoadable
    {
        void InitializeObject(object[] parameters);
        bool IsInitialized { get; }
    }
    Evidemment pour le passage de paramètres c'est pas super pratique, mais la généricité à un prix... On pourrait aussi utiliser un IDictionary<string, object> à la place de object[], ça faciliterait un peu la récupération des paramètres.
    Non j'ai pas besoin d'autant généricité lol (et de complication lol).
    C'est vrai que je n'ai absolument pas le réflexe d'utiliser des Interface je crois que je vais m'essayer pour le test d'implémenter une telle solution, merci pour ce tuyaux.

  11. #11
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    Niveau perf c'est bon ?
    Car je fais attention de ne pas trop me connecter a la BDD.

    Du coup avec le lazy loading y a bcp plus d'acces.

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Citation Envoyé par topolino Voir le message
    Niveau perf c'est bon ?
    Car je fais attention de ne pas trop me connecter a la BDD.

    Du coup avec le lazy loading y a bcp plus d'acces.
    Entre récupérer un champs de 5000 Char ou un fichier que tu ne vas pas utiliser et faire l'appel seulement quand tu en as besoin (et donc un accès en plus), tu peux vraiment être gagnant ...

    Puis tu peux ne pas le généraliser et l'utiliser que sur des données couteuse ... Ma question était au départ porté sur la validité de cette approche, c'est ce que m'a confirmé pvialatte plus haut ...

    Sans oublier que tu n'es pas obliger de l'utiliser puisque comme tout DP, il est fait pour répondre à une problématique ... Si tu ne l'as pas, la question ne se pose pas (enfin je pense )

  13. #13
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    Dans c cas la, j'utilise un autre objet businessn que j'apelle en tps voulu.

    AU lieu d'en avoir un grand objet metier j'en ai 2

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Citation Envoyé par topolino Voir le message
    Dans c cas la, j'utilise un autre objet businessn que j'apelle en tps voulu.

    AU lieu d'en avoir un grand objet metier j'en ai 2
    A mon avis on ne découpe pas les objets par rapport à la taille de données, je ne vois la pertinence d'un Object descriptionArticle ...

    Et autre chose l'utilité de ce DP c'est la transparence de cette manœuvre pour les couches supérieurs, dans ton cas tu dois appeler la BLL pour chercher cette infos, dans le cas du Lazy Loading tu appel ton monArticle.Desc comme s'il était dispo ...

  15. #15
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    Merci pour tes conseils.

    Aurais tu un exemple de a à z d'implementation et d'utilisation ?

  16. #16
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Citation Envoyé par topolino Voir le message
    Merci pour tes conseils.

    Aurais tu un exemple de a à z d'implementation et d'utilisation ?
    Non j'ai pas d'exemple complet dsl

  17. #17
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    SI je comprends bien, il faut dans notre objet metier des classes appelant la couche metier pour les proprietes qu'on desire appeler plus tard. c'est ca ?

Discussions similaires

  1. Lazy loading et cache lev. 2
    Par fjalt dans le forum Hibernate
    Réponses: 1
    Dernier message: 27/10/2011, 15h18
  2. Gestion du cache en Load Balancing
    Par loic_86 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 10/09/2007, 10h00
  3. [HIBERNATE 3]Lazy loading
    Par SEMPERE Benjamin dans le forum Hibernate
    Réponses: 11
    Dernier message: 08/02/2006, 22h40
  4. [Sécurité] Gestion du cache / cookies
    Par dug dans le forum Langage
    Réponses: 4
    Dernier message: 25/01/2006, 21h17
  5. [Xml][Memoire] gestion du cache
    Par tatou42 dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 21/09/2005, 17h48

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