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 perf]


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 102
    Par défaut [Cache et perf]
    J'utilise Hibernate3.0 (Persistence EJB3.0 avec annotation) en dehors d'un serveur d'application pour apprendre.

    soit le code suivant qui fait une pauvre requète select sur une table Salesman avec une jointure OneToOne sur une autre table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Session session = HibernateUtils.getSession();
     
    List<Salesman> salesmen = session.createQuery("from Salesman").list();
     
    session.close();
    return salesmen;
    si j'ai le paramètrage:
    hibernate.connection.pool_size 0
    Le temps pour ma requète est de 5 sec (innacceptable)

    si je mets
    hibernate.connection.pool_size 1
    J'ai beau changer les valeurs dans la base, j'ai toujours le même resultat (le 1°)

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    La propriété hibernate.connection.pool_size permet de régler la taille du pool de connexions. Le pool n'agit pas sur la performance des requêtes mais sur l'obtention d'une connexion à la base de données.

    Combien d'enregistrements cette requête devrait-elle te renvoyer ?
    As-tu exécuter la même requête en sql directement sur la base pour voir si le problème ne vient pas de la base ?

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 102
    Par défaut
    c'est une base de tests avec 6 enregistrements!!

    J'ai fait afficher les requètes que j'ai directement executé sur ma base (MySQL) et c'est immediat!!

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 102
    Par défaut
    mais je me demandais, vu le nombre de dépendance qu'il y a (ProXool, ehCach C3PO, etc...) peut être qu'il me manque une jar dans mes dépendances??

    En tout cas, vu qu'Hibernate est beaucoup utilisé, j'imagine que niveau perf, ça assure un minimum!!??

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Ta base est-elle sur le même poste que ton appli ?

    Hibernate n'est pas en cause pour ce problème de perf.
    J'ai déjà récupéré plusieurs milliers d'enregistrements dans des temps tout à fait corrects.

    S'il te manquait quelque chose tu aurais une erreur dans tes logs.
    Les jars que tu viens de citer concernent les pools de connexion et la gestion du cache. Ces fonctionnalités ne sont pas indispensables pour "tester" Hibernate.

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 102
    Par défaut
    ça me rassure alors!!

    non, ma base n'est pas sur la même machine!

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 102
    Par défaut
    par contre, j'ai un truc étrange dans les requètes générés, c'est que j'ai la première requète qui va chercher mes "commerciaux" puis j'ai une requète par enregistrement pour faire la jointure sur la 2° tables!!??

    J'aurai plutot imaginé une seule requète!!??

    mon objet:
    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 Salesman {
    @Id
      public int Id;
     
    ...
     
    //la jointure
        @OneToOne(cascade = CascadeType.ALL) //???
        @JoinColumn(name = "addressId")
        @NotFound(action = NotFoundAction.IGNORE)
        public Address getAddress() {
            return address;
        }
     
    }

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    L'attribut fetch="join|select" te permet de gérer tes associations.
    Le join va tout récupérer en une seule requête.
    Le select va générer une deuxième requête.

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 102
    Par défaut
    bon allez, j'ai un peu honte de le demander mais je sens que tu vas me faire gagner du temps (je pourrais en effet chercher tout seul) mais...

    comment?? c'est où que l'on defint ce param? dans un attribut d'une annotation ou dans le fichier de config?

    (je cherche seul en parrallèle toutefois )

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 102
    Par défaut
    j'ai trouvé ceci:
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    ou
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)

    ???

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    J'utilise les fichiers xlm et non pas les annotations.
    Donc je ne connais pas la syntaxe dans ton cas.
    Dans un fichier xml, c'est une propriété du tag de ton association,
    en l'occurence, du tag one-to-one.

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    http://www.hibernate.org/hib_docs/an...ingle/#d0e2203

    Va voir ce paragraphe de la doc, c'est expliqué.

  13. #13
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 102
    Par défaut
    bon, ça change rien mais je vais chercher!!

    Mais je reviens à mon problème initial!! pourquoi quand je change les données dans la base, ma requète hibernate renvoie toujours le même premier resultat!!
    Comme si la requète et son resultat etait "caché"!!??

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Les données, tu les modifies directement dans la base par sql (ou un outil graphique) ou avec Hibernate ?

  15. #15
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 102
    Par défaut
    je modifie la base avec phpmyadmin!
    j'ai un peu de mal avec hibernate mais quand même!!

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Si tu n'as pas activé le cache de requête, normalement, tu devrais avoir les données à jour.

  17. #17
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Petite question qui donnerait une réponse rapide à ton probleme.
    Ton programme fait quoi exactement ? Juste une requete SQL ?

    Si c'est le cas je crois savoir pourquoi Hibernate met 5sec à te donner une réponse :

    A chaque lancement de programme tu initialises Hibernate; ce qui lui prend 5sec environ avant de commencer a travailler. Si tu veux t'en rendre compte, fais, dans le même programme une quinzaine de requetes et tu verras qu'ils mettra sensiblement 5secondes également !

    C'est pourquoi Hibernate est à préconiser sur une application serveur ... qui tourne en permanence car Hibernate n'a pas a se reinitialiser a chaque requete .

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Effectivement, la phase d'initialisation prend un peu de temps.
    Cependant, elle ne s'effectue qu'une fois que ce soit une application serveur ou pas:
    - soit au lancement de l'application
    - soit lors de la première requête
    Tout dépend de la façon dont tu le gères.

  19. #19
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 102
    Par défaut
    mouais....

    je vois bien qu'à la 1° requète, j'ai moult traces qui apparaissent mais plus après!! j'ai juste mes requètes!! (peut on se fier au log??)
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    ...
    INFO: Query language substitutions: {no='N', true=1, yes='Y', false=0}
    9 août 2006 13:56:32 org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Second-level cache: enabled
    9 août 2006 13:56:32 org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Query cache: disabled
    9 août 2006 13:56:32 org.hibernate.cfg.SettingsFactory createCacheProvider
    INFO: Cache provider: org.hibernate.cache.EhCacheProvider
    9 août 2006 13:56:32 org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Optimize cache for minimal puts: disabled
    9 août 2006 13:56:32 org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Cache region prefix: hibernate.test
    9 août 2006 13:56:32 org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Structured second-level cache entries: disabled
    9 août 2006 13:56:32 org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Echoing all SQL to stdout
    9 août 2006 13:56:32 org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Statistics: enabled
    9 août 2006 13:56:32 org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Deleted entity synthetic identifier rollback: disabled
    9 août 2006 13:56:32 org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Default entity-mode: pojo
    Hibernate: select salesman0_.id as id8_, salesman0_.addressId as addressId8_, salesman0_.comment as comment8_, salesman0_.firstName as firstName8_, salesman0_.lastName as lastName8_, salesman0_.userName as userName8_, salesman0_.phone as phone8_ from Salesman salesman0_
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    9 août 2006 13:56:32 org.hibernate.impl.SessionFactoryImpl <init>
    INFO: building session factory
    9 août 2006 13:56:34 org.hibernate.impl.SessionFactoryObjectFactory addInstance
    INFO: Not binding factory to JNDI, no JNDI name configured
    Hibernate: select salesman0_.id as id8_, salesman0_.addressId as addressId8_, salesman0_.comment as comment8_, salesman0_.firstName as firstName8_, salesman0_.lastName as lastName8_, salesman0_.userName as userName8_, salesman0_.phone as phone8_ from Salesman salesman0_
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Hibernate: select address0_.key as key6_0_, address0_.address as address6_0_, address0_.state as state6_0_, address0_.country as country6_0_, address0_.city as city6_0_, address0_.zipcode as zipcode6_0_ from address address0_ where address0_.key=?
    Dans ma console, à chaque requète, je vois juste le requète sql généré mais le resultat ne correspond pas!! (sauf le premier coup)

    et mon cache de requète n'est pas activé!!
    ## enable the query cache
    #hibernate.cache.use_query_cache true

    et tant que j'y suis, c'est quoi le cache de 2° niveau??
    ## disable the second-level cache
    #hibernate.cache.use_second_level_cache false

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Le cache de second niveau permet de stocker des objets dans un cache lors de leur première récupération en base.
    Lors d'une nouvelle récupération, il n'y a pas d'accès à la base de données mais directement au cache.
    Ceci est valable pour get, load entre autres.

    Pour ce qui est des ojets récupérés par requêtes, c'est différent.
    Il faut activer le cache de second niveau et le cache de requete et pour chaque requete faire un:
    query.setCacheable(true);

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Répertoire caché
    Par KUBITUS dans le forum Delphi
    Réponses: 30
    Dernier message: 13/04/2007, 08h19
  2. Ouvrir (fopen) un fichier caché
    Par shef dans le forum C
    Réponses: 2
    Dernier message: 09/09/2002, 10h06
  3. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 12h49
  4. Webbrowser : Comment ne pas prendre la page en cache
    Par cedm78 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 30/08/2002, 12h17

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