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

Hibernate Java Discussion :

Comment charger et garder en RAM seulement les objets nécessaires ?


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Par défaut Comment charger et garder en RAM seulement les objets nécessaires ?
    Bonjour

    Je débute avec Hibernate. Après avoir galéré sur la config, je vois assez mal comment faire ce qui va suivre.

    Pour faire simple, j'ai 2 classes. Recherche est par exemple une recherche sur Google et Item un résultat de la recherche.

    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
    Public class Recherche
    {
       Collection<Item> items;
       String keywords;
       int id;
       ...
    }
     
    Public class Item
    {
       String url;
       String title;
       int id;
       Image img;
       ...
    }
    J'ai fais les fichiers de mapping, avec une table de jointure du type RechercheItem(rechercheid, itemid)

    La persistance fonctionne bien.

    L'IHM est du type client RSS, a gauche une liste des recherches, et quand on clique sur une, à droite, dans un jtable, qui affiche la liste des items de la recherche.

    Les items pouvant être par milliers, avec une image attachée, les instances sont très gourmandes en mémoire.

    Je me demande donc comment faire pour ne CHARGER et GARDER en mémoire à un instant T seulement les instances des items dont la recherche est actuellement visualisée dans l'IHM ? Donc si je change la recherche actuellement sélectionnée, les items de la recherche précédente doivent "disparaitre" de la RAM. Mais les recherches doivent restées chargées, car elles sont toujours affichées à gauche.

    Si j'ai bien compris, le lazy load instancie "vraiment" (remplissage de tous les attributs etc) les objets lors du premier accès, mais après, ils restent complètement en mémoire.

    Les items doivent être persistés (pour garder un historique)

    Je vous remercie d'avance pour toute piste utile que vous pourriez connaitre.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu peux utiliser les méthodes setFirstResult(int) et setMaxResults(int) de la classe Query pour éviter de charger tous les items et afficher les résultats n par n comme un système de pages de résultats ou tu as n résultats par page.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Par défaut
    Tout d'abord, merci pour ta réponse.

    Je comprends le principe. Mais du coup, comme Collection<Item> items n'est plus utile, je dirais qu'il faut supprimer le mapping dessus ? Car celle-ci va uniquement servir pour stocker les items affichés en GUI, avec des requêtes "manuelles".

    Si oui, pour le coup, je ne vois plus comment je vais faire les requêtes avec setMaxResults(int). En effet, la join table RechercheItem(rechercheid, itemid) ne sera plus référencée dans les fichiers de mapping.

    Les schémas sont les suivants
    Recherche(id, keywords...)
    Item (id, url, title, imgURL...)
    RechercheItem(rechercheid, itemid)

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    si tu met ta collection en lazy et que tu n'y accède jamais, ce ne sera pas un soucis. Tu peux aussi mettre ta collection en private pour éviter qu'un programmeur ne soit tenté de l'utiliser.

    Pour ce qui est de la persistance des données en mémoire, si tu ferme bien ta session hibernate à la fin de chaque requête HTTP, tu n'aura rien qui persistera en mémoire.

    Une autre solution, c'est de retirer la collection (relation one-to-many) mais de conserver l'autre coté de la relation dans le mapping (relation many-to-one). Ainsi tu n'aura plus aucune navigation possible recherche -> item, mais tu continuera a associer un item à un recherche.

    Enfin, vu que l'usage s'oriente vers du pur requête et peu d'utilité du modèle objet, si ta base de donnée se résume uniquement à ces quatre table, je te recommande d'utiliser plutôt des framework bas niveau de type mybatis qui devraient te satisfaire.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Par défaut
    Merci beaucoup pour vos réponses. La seconde solution (garder la relation many-to-one) m'allait bien et semble fonctionner (pour d'éventuels lecteurs dans un cas similaire, ne pas oublier de mettre inverse = true sinon la table de jointure ne sera pas remplie)

    Mais malheureusement, après plusieurs heures de bidouille, d'exceptions aléatoires, et les performances à c****, je laisse tomber Hibernate, trop compliqué pour apporter finalement pas grand chose. Je vais regarder myBatis puis sinon je ferais mes DAO.

    Merci à vous !

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

Discussions similaires

  1. Garder l'icône "Identifier les objets" activée
    Par Kivenkantaja dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 12/06/2012, 22h06
  2. Réponses: 1
    Dernier message: 21/09/2011, 14h29
  3. Réponses: 4
    Dernier message: 13/02/2007, 16h23
  4. Réponses: 1
    Dernier message: 20/10/2006, 21h57
  5. [Forms6i] Comment charger les fichiers du client ?
    Par patmaba dans le forum Forms
    Réponses: 10
    Dernier message: 31/01/2005, 16h17

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