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 :

Optimisation du chargement d'associations @Any dans une grosse collection


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Optimisation du chargement d'associations @Any dans une grosse collection
    Bonjour à tous,

    Le forum officiel hibernate semblant définitivement mort, je viens voir ici si vous pourriez m'aider.
    Je vous expose d'abord un peu les entités :

    L'entité Parent a une collection d'Administrator (pouvant aller jusqu'à 8000 Admin). Chaque entité Administrator a une association @Any pouvant pointer vers 3 types d'entités différentes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Parent {
             ...
            @OneToMany(mappedBy="parent", fetch=FetchType.LAZY)
    	@OrderBy("DATE desc")
    	@BatchSize(size=100)
    	@Filter(name="activeOnly")
    	private final Set<Administrator> administrators = new TreeSet<Administrator>();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Administrator {
      some other stuffs...
     
      @Any(metaColumn=@Column(name="TYPE"), optional = false, fetch=FetchType.EAGER)
        @AnyMetaDef(idType="long", metaType="string", metaValues= {
            @MetaValue(targetEntity=A.class, value="A"),
            @MetaValue(targetEntity=B.class, value="B"),
            @MetaValue(targetEntity=C.class, value="C")
            })
        @JoinColumn(name="NUM")
        private RelationTypeIdentifier<Long> relation;
    }
    J'ai de gros problèmes de performance dans le chargement de l'entité parent, 1 requête étant faite pour chaque association @Any, pour le moment, le meilleur (mais pas glorieux) moyen que j'ai trouvé pour accélerer le chargement est de faire une simple query SQL pour récuperer les ids des entités de l'association @Any et de charger celles-ci par batch de 200 via une query criteria.

    Le cache hibernate contiendra ensuite ces entités et elle seront résolues directement depuis le cache sans qu'il soit nécessaire de faire une requête.

    En fonctionnant de cette manière le temps de chargement est divisé par 3 mais reste très élevé (dans les 14 secondes pour le chargement complet de l'entité parent).

    Malheureusement, je ne peux pas faire de modifications sur la base de données car des centaines de jobs tournent dessus.

    Je suis conscient que se fier au cache hibernate pour le chargement n'est pas la meilleure solution mais je n'en vois pas d'autre pour l'instant alors si quelqu'un a d'autres idées, elles seraient les bienvenues.

    Merci.

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Avez-vous conscience qu'un Set (qui cache un Map) implique que chaque insertion nécessite de vérifier si l'objet est dans l'ensemble et cela se fait par l'évaluation de equals() ?
    Avez-vous évaluer la performance de vos equals() et hashCode() ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour JeitEmgie,
    Les equals et hashCode utilisent uniquement l'id technique qui est un Long, donc pas de problème de perf de ce côté là.

    PS: Réponse tardive, j'étais en vacances.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/08/2009, 20h58
  2. chargement de Table SAS dans une table Oracle
    Par id301077 dans le forum Administration et Installation
    Réponses: 2
    Dernier message: 05/03/2009, 17h56
  3. [ADO][Access] Chargement d'un csv dans une table
    Par Laurent Dardenne dans le forum Bases de données
    Réponses: 13
    Dernier message: 08/07/2008, 22h24
  4. [MySQL] Chargement de données MySQL dans une liste déroulante
    Par brindherbe86 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/03/2008, 18h02

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