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 :

Hibernate - chargement des résultats d'une requête


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Par défaut Hibernate - chargement des résultats d'une requête
    Bonjour à tous,

    j'ai une application dans laquelle je récupère une collection d'objet en fonction de certain critère définit.

    Mon problème, c'est que le nombre de résultat de la requête est trop important (~300 000 objets) et provoque un java.lang.OutOfMemoryError.

    Je précise que j'ai déjà étendu la mémoire allouer à Java (1Go, je ne peux mettre +), et que je suis en lazyload.

    Comme il s'agit essentiellement de traitement dans des batch, j'avais pour certain contourné le problème en modifiant mes requêtes et mon code pour ne retourner que N résultat, et avec une boucle pour faire une nouvelle requête pour les N suivant (etc.) en faisait un commit à chaque itération de cette boucle.

    Si ça marche, la solution n'est pas bien élégante à mon gout, et nécessite pas mal de changement (réécriture des requêtes).

    J'aimerai savoir s'il y a un mécanisme d'Hibernate qui permettrait de charger les résultat petit à petit pour éviter d'exploser la mémoire avec l'instanciation de tous les objets d'un coup ?
    Si ça existe, je n'ai rien trouvé

    Merci

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par gargantua Voir le message
    Bonjour à tous,

    j'ai une application dans laquelle je récupère une collection d'objet en fonction de certain critère définit.

    Mon problème, c'est que le nombre de résultat de la requête est trop important (~300 000 objets) et provoque un java.lang.OutOfMemoryError.

    Je précise que j'ai déjà étendu la mémoire allouer à Java (1Go, je ne peux mettre +), et que je suis en lazyload.

    Comme il s'agit essentiellement de traitement dans des batch, j'avais pour certain contourné le problème en modifiant mes requêtes et mon code pour ne retourner que N résultat, et avec une boucle pour faire une nouvelle requête pour les N suivant (etc.) en faisait un commit à chaque itération de cette boucle.

    Si ça marche, la solution n'est pas bien élégante à mon gout, et nécessite pas mal de changement (réécriture des requêtes).

    J'aimerai savoir s'il y a un mécanisme d'Hibernate qui permettrait de charger les résultat petit à petit pour éviter d'exploser la mémoire avec l'instanciation de tous les objets d'un coup ?
    Si ça existe, je n'ai rien trouvé

    Merci
    http://java.dzone.com/articles/hiber...-queries-using

    ou :
    développez votre propre classe "PagedList"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class PagedList<T> extends AbstractList<T> {
    qui devra avoir connaissance de votre classe Repository (ou DAO suivant votre convention de vocabulaire…) et gérera donc les "missed hits"…

    ou :
    il est possible d'arriver à de bons résultats aussi en architecturant la solution avec une couche Service (qui sera la couche Secured et Transactional) qui reçoit en paramètre un DataWriter ou un DataReader (suivant que votre besoin concerne un bacth "export" ou " import" …)
    le DataWriter/Reader s'interfaçant avec la couche Repository pour fetcher par lots les données…

    ou:
    SpringBatch

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    J'ai du rater quelque chose, mais utiliser les deux méthodes suivantes n'est pas suffisant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    q.setFirstResult(20);
    q.setMaxResults(10);
    Après une bonne boucle et le tour est joué. Il n'y a pas besoin de réécrire de requête.
    Et cela ne me parait pas spécialement sale.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Par défaut
    Citation Envoyé par fr1man Voir le message
    J'ai du rater quelque chose, mais utiliser les deux méthodes suivantes n'est pas suffisant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    q.setFirstResult(20);
    q.setMaxResults(10);
    Après une bonne boucle et le tour est joué. Il n'y a pas besoin de réécrire de requête.
    Et cela ne me parait pas spécialement sale.
    C'est ce que j'ai fait là ou j'ai déjà fait des modifs mais le truc qui ne me plait pas trop ou qui est simplement pénible :
    - il faut changer tous les prototypes (et les interfaces) des différentes couches
    - les requêtes sont parfois utilisés ailleur (avec des critères différents, qui ne provoque pas le problème énnoncé), donc soit je change les appels de partout, ça je créé de nouvelle méthode à gogo.

    Mais c'est sur que ça marche en effet.


    JeitEmgie, merci, je vais aller regarder ça.

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Par défaut
    Je suis tombé sur l'objet org.Hibernate.ScrollableResults qui est un itérateur sur les résultats, mais les infos que j'ai trouvé sont floues pour moi.

    Quelqu'un c'est comment cela fonctionne au niveau des requêtes vers la base ?
    ça remonte quand même en mémoire tous résultats de la requête ?
    Est-ce qu'il y a une requête à chaque fois qu'on fait un .next() ?


    Merci

Discussions similaires

  1. Numérotation automatique des résultats d'une requête
    Par Nicola dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 28/07/2006, 19h57
  2. Réponses: 2
    Dernier message: 02/12/2005, 21h21
  3. Réponses: 1
    Dernier message: 02/12/2005, 20h18
  4. Pagination des résultats d'une requête
    Par dl_jarod dans le forum ASP
    Réponses: 2
    Dernier message: 17/10/2005, 14h30
  5. Calcul à partir des résultats d'une requète
    Par Sendo dans le forum Access
    Réponses: 1
    Dernier message: 29/09/2005, 17h46

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