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 :

Cache et Associations ?


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 716
    Par défaut Cache et Associations ?
    Bonjour

    Je cherche a confirmer ou non, si je met en cache de second niveau au depart d'un traitement deux Entity, relié par un ManyToOne.
    L'association n'etant pas en Cache, il y aura quand meme des requetes vers la Base dans le cours du traitement apres bien sur la routine qui monte en cache les Entity ?

    Merci
    Phil

  2. #2
    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
    le cache de second niveau contient des données et, éventuellement, le résultat de requetes cachée sous vis avez activé le cache des Statements. Si pas, dans tous les cas, il y aura requete sql pour récupérer les IDs des différents objets concernés par le résultat, mais la population des entités (tout ce qui n'est pas ID donc) se fera par le cache de second niveau.
    De même si vous faites des Session.load() il viendront du cache de second niveau (voir du premier niveau quand c'est possible :p)

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 716
    Par défaut
    Bonjour

    Merci pour la réponse
    J'ai mis en cache deux entité de 18000 et 30000 BO.
    Dans les statictics le LoadCount a bien une valeur, j'ai fait en HQL un select * en debut de programme ce qui pour moi siginie que ces objets sont bien en cache, MAIS dans une boucle ou je dois requete je me prend 400ms par boucle sur l'entté de 18000 et 600ms pour l'entité de 30000.
    Soit 1seconde par boucle, et je dois la faire dans mon batch 350000 fois !
    Une idee ??

    Merci
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
    ------------
    2011-02-11 12:28:52,144 [DEBUG] [pool-1-thread-1]  EntityNames= com.core.bo.parameters.TopOD=EntityStatistics[loadCount=18226,updateCount=0,insertCount=0,deleteCount=0,fetchCount=0,optimisticLockFailureCount=0]
    ---
    2011-02-11 12:28:53,596 [DEBUG] [pool-1-thread-1] 
    Before topODDAO.findAllUsed
    2011-02-11 12:28:53,596 [DEBUG] [pool-1-thread-1] Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@6f92c766] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@a62b39f] bound to thread [pool-1-thread-1]
    2011-02-11 12:28:53,596 [DEBUG] [pool-1-thread-1] Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@6f92c766] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@a62b39f] bound to thread [pool-1-thread-1]
    2011-02-11 12:28:54,969 [DEBUG] [pool-1-thread-1] 
     
     
     
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains CloseStatementCount     =21989
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains CollectionFetchCount    =0
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains CollectionUpdateCount   =0
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains EntityFetchCount        =469
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains EntityInsertCount       =0
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains EntityDeleteCount       =0
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains QueryCacheHitCount      =0
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains SecondLevelCacheHitCount=0
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains SessionOpenCount        =3
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains CollectionLoadCount     =0
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains ConnectCount            =3
    2011-02-11 12:28:52,155 [DEBUG] [pool-1-thread-1] The hibernate cache contains FlushCount              =2

  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
    comprend rien, quelle entité, c'est quoi les BO, y a quoi dans la boucle? Et comme mapping? Vous devez faire quoi 350.000 fois?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 716
    Par défaut
    Bonsoir

    Désole c'est le Jargon de la sociéte ou je bosse.
    Au depart j'ai une Liste d'objets que je ne lis qu'une seule fois, mais qui contient 350000 objets .
    Dans cette boucle je recherche par des SELECT WHERE en HQL qui ne sont pas sur la clef technique primaire des données dans l'objet TopOD, j'ai l'impression qu'il n'est pas en cache !
    Le cache fonctionne t 'il avec des objets non sur la clef primaire ?

  6. #6
    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
    cache ou pas cache, le select sera exécuté par la base de donnée. Il n'y a pas de raison qu'il mette 1 seconde à répondre, a moins d'avoir une where très tordu et un SGDB sur les genoux. Le cache sert à éviter de charger les objet depuis la DB, mais en aucun cas les requete HQL ne sont interprétées par ce cache.

    Grosso modo: le cache de premier niveau c'est une Map<Id,Instance>
    et le cache de second niveau c'est une Map<Id,String[]>
    et le moteur un HQL c'est un converteur HQL->SQL

    simplement avec le cache, quand vous faites select * from MonType, il y a deux interprétation possibles:

    soit ça deviens:
    select ID from Table_Type;
    retournant N ids, suivi de N fois une recherche dans le cache, suivis, pour chaque entrée pas dans le cache d'un select Champ1,champ2,champe3,.... from Table_Type where ID=?

    Autre cas possible dépendant de la configuration, un seul
    select ID, Champ1,champ2,champe3,.... from Table_Type

    Le premier nécessite beaucoup de requetre SQL, mais si beaucoup d'ids sont souvent en cache, c'est payant car après la "chauffe", beaucoup d'infos sont lue depuis le cache

    Le second est la config par défaut d'hibernate, on minimise les requete. L'ennui, c'est que si, dans votre boucle, vous rappatriez, disons, 50.000 objets qui sont déjà dans le cache, c'est autant de données qui transitent inutilement dans le réseau pour qu'au final hibernate ne conserve que les ID.

    PS: je me souviens plus du noms du paramètre de config.

    Et si vous voulez avoir le full control, vous pouvez toujours faire ce genre de chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    List<Serializable> result = session.createQuery("select T.id from MonType T where ......").list(); // taille de réponse minimale
    List<MonType> types = new ArrayList<MonType>(result.size());
    for (Serializable i : result)
      types.add(session.load(i)); //cache utilisé à plein tube là

Discussions similaires

  1. [Python 2.X] Associer une fonction à une fenêtre cachée (.withdraw)
    Par mr.débutant dans le forum GUI
    Réponses: 3
    Dernier message: 18/04/2015, 09h11
  2. association bidirectionnelle + second level cache
    Par snopims dans le forum Hibernate
    Réponses: 1
    Dernier message: 16/10/2009, 23h11
  3. Association, has_many through et cache
    Par Jubee dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 05/03/2008, 17h50
  4. TListBox : Chaines associées à un id caché
    Par numberwan dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/04/2003, 10h27
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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