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 :

Grosses collections et lazy : besoin d'explication


Sujet :

Hibernate Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Points : 32
    Points
    32
    Par défaut Grosses collections et lazy : besoin d'explication
    Bonjour à tous,

    J'ai parcouru un peu les différents topics au sujet du lazy d'hibernate, mais j'ai encore du mal à bien utiliser hibernate pour de grosses sélections.
    Donc j'ai un mapping de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		<set name="probesetsOfCdf" lazy="extra" >
    			<key column="pbset_cdf_id"/>
    			<one-to-many class="app.Probeset"/>
    		</set>
    Donc ce set doit contenir plus de 50 000 élements, j'ai donc essayé de mettre le lazy à "extra" pour que cette portion de code fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		Set<Probeset> pbsets = cdf.getProbesetsOfCdf();
    		System.out.println("TEST CDF = " + pbsets.size());
    Du coup, je pensais que c'était gagné, càd que j'ai enfin pu "charger" une grosse collection, mais en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		Iterator iter = pbsets.iterator();
    		while (iter.hasNext()) {
    			Probeset p = (Probeset)iter.next();
    			System.out.println(p.getPbsetName());
    		}
    Et bien là, c'est le drame :
    java.lang.OutOfMemoryError: Java heap space
    Donc voilà, comment fait-on pour travailler sur une grosse collection et pour que Hibernate se charge lui-même de charger les élements quand on en a besoin...C'est avec la configuration du lazy qu'on peut le faire?

    Merci d'avance pour vos réponses.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Points : 32
    Points
    32
    Par défaut
    Petite précision, c'est hibernate synchronizer sous Eclipse qui m'a généré l'ensemble des classes et j'ai donc surtout modifié les fichiers Hbm générés pour le mapping

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par waflyx Voir le message
    Bonjour à tous,

    J'ai parcouru un peu les différents topics au sujet du lazy d'hibernate, mais j'ai encore du mal à bien utiliser hibernate pour de grosses sélections.



    Donc voilà, comment fait-on pour travailler sur une grosse collection et pour que Hibernate se charge lui-même de charger les élements quand on en a besoin...C'est avec la configuration du lazy qu'on peut le faire?

    Merci d'avance pour vos réponses.
    1. Hibernate n'est pas fait pour les (très) grosses collections… (et c'est expliqué dans la doc…)

    2. Il existe des outils pour les manipulations de grosses collections, genre Spring-batch…

    3. La doc donne quelques hints pour contourner le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    You can use a collection filter to get the size of a collection without initializing it: 
    ( (Integer) s.createFilter( collection, "select count(*)" ).list().get(0) ).intValue() 
    The createFilter() method is also used to efficiently retrieve subsets of a collection without needing to ini- 
    tialize the whole collection: 
    s.createFilter( lazyCollection, "").setFirstResult(0).setMaxResults(10).list();
    3. Dans certaines situations, il y a moyen de s'en sortir en appliquant quelques patterns simples du style producteur/consommateur au niveau de la couche service (donc isolés du point vue transactionnel) qui travailleront sur des subsets de la collection. Cela implique "d'oublier" le côté One de la relation et d'accéder au côté Many "en direct" == sans passer par le champ "Collection" de la relation père mais par un query du genre "FROM DaughterClass WHERE itsOwner = :owner" + un filtre utilisant setFirstResult et setMaxResults …

    4. Il n'est pas très difficile d'écrire sa propre classe "Collection" paginée, c'est juste un pattern un peu curieux car il doit avoir accès à la couche "repository" (celle que d'aucuns appellent improprement DAO…) alors qu'en général on essaie que ce soit le repository qui manipule son contenu et non l'inverse… (cette collection paginée pourra servir de brique pour le point 3…)

    5. NB
    a. utiliser le filtrage setFirstResult().setMaxResults() dans une boucle qui est elle-même dans une seule transaction ne résoud évidemment rien quant au "Out of memory"…
    b. tout ceci implique que si les objets "fils" ont aussi des relations OneToMany vers des grosses collections, le même problème se posera plus loin (en "cascade" si l'on ose dire…)

    6. Solution "idéale" :
    que la collection paginée du point 4 remplace celle qu'Hibernate met en place en tant que proxy pour gérer les accès à la lazy Collection…
    (gros travail…)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Points : 32
    Points
    32
    Par défaut
    Bonjour ,
    Merci beaucoup pour votre réponse, ça m'a très bien éclairci. Je vais d'abord tester la 3ème solution du coup.
    bonne journée

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/08/2009, 08h52
  2. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  3. [C#] J'aurais besoin d'explication
    Par Roach- dans le forum Windows Forms
    Réponses: 18
    Dernier message: 10/03/2005, 16h00
  4. Besoin d'explications sur float et l'élasticité !
    Par KneXtasY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/01/2005, 15h15
  5. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34

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