gestion du cache, best practices et sessions [Hibernate] - Java - Programmation
Marsh Posté le 26-06-2008 à 14:30:53
Je sais que c'est un peu long à lire, alors un peu de courage.
Si vous avez des liens ou autres vous gênez pas
Marsh Posté le 27-06-2008 à 15:34:01
je connait plus la partie JPA de hibernate mais quand même une remarque:
On peux définir des "fetch plan" pour la lecture de donnée et des "cascade" pour le persist:
Du coup pas besoin de sauver LienMembreCompteRendu, le save de "message" suffit. (ca c'est pour le cascade, le fetch c'est pour la lecture et ne pas avoir des lazyException
Pour ce qui est de la fermeture de la session à chaque méthode c'est pas le mieux non plus il me semble.
Voir le design pattern "open session in view" pour une solution simple (mais qui à des effets de bords)
Les annotations springs peuvent faire beaucoup. Pour une nouvelle application, je conseillerai de commencer avec JPA (et l'implémetation d'hibernate) plutot que du pur hibernate.
Marsh Posté le 27-06-2008 à 16:12:17
tempo14 a écrit : je connait plus la partie JPA de hibernate mais quand même une remarque: |
Merci pour les informations, j'étais justement entrain de regarder les fetch plan et plus particulièrement le lazy loading afin d'optimiser le chargement car j'ai l'impression qu'hybernate à une stratégie agressive de base. Je me suis également penché sur le cache, et à ce niveau la j'ai un problème curieux. Il met 2 fois plus de temps avec le cache que sans (cache de second niveau), je pense que j'ai pas bien paramétré tout ça encore. Je vais regardé le design pattern que tu me conseil aussi.
PS: pour ceux qui cherchent des informations sur le cache de second niveau d'hibernate allez voir ce site
http://www.devx.com/dbzone/Article/29685/0/page/1
Il est pas mal, en plus y a un exemple.
Marsh Posté le 27-06-2008 à 16:15:41
par défaut (au moins en JPA) hibernate fait du lazy loading pour les type complexe, pas pour les String, Double et autre Integer
Marsh Posté le 27-06-2008 à 16:19:01
tempo14 a écrit : par défaut (au moins en JPA) hibernate fait du lazy loading |
Okay, je comprend pas d'où viens c'est temps de recherche excessif alors. Presque 1 seconde pour charger certaines données.
Marsh Posté le 27-06-2008 à 16:25:07
par contre dans le lien que tu donnes, on voit que le cache de premier niveau est associé à la session. C'est pas une bonne idée de l'ouvrir et la fermer dans chaque méthode. Pour ce qui est du problème de performance, un "showsql=true" donne généralement de bonne indications
Marsh Posté le 27-06-2008 à 16:45:46
tempo14 a écrit : par contre dans le lien que tu donnes, on voit que le cache de premier niveau est associé à la session. C'est pas une bonne idée de l'ouvrir et la fermer dans chaque méthode. Pour ce qui est du problème de performance, un "showsql=true" donne généralement de bonne indications |
Le cache de premier niveau n'est pas propre a une session? J'avais cru comprendre que le cache de premier niveau (requête) l'était et que le second niveau était commun à tous?
Au fait, je suis entrain de regarder la cascade sur le lien suivant (chapitre 21.3)
http://www.hibernate.org/hib_docs/ [...] child.html
Je comprend pas j'ai pas commit dans la base on diré? pourtant tout correspond aux explications et j'ai même testé avec une transaction?
Marsh Posté le 27-06-2008 à 17:11:36
Citation : Le cache de premier niveau n'est pas propre a une session? |
oui c'est ca, pourquoi? je ne dis pas l'inverse?
Citation : Je comprend pas j'ai pas commit dans la base on diré? pourtant tout correspond aux explications et j'ai même testé avec une transaction? |
Je pense que le commit au niveau de la db ne se fait pas nécessairement au "transaction.commit();" mais plutôt au "session.flush();" (à valider)
Marsh Posté le 27-06-2008 à 17:25:20
tempo14 a écrit :
|
Ben tu avais l'air de dire que le cache de premier niveau n'est pas propre à une session et j'ai cru comprendre que cache session avait son propre cache de requête.
tempo14 a écrit :
|
Code :
|
Déjà au debuger il me retourne pas une classe de type Base on dirait, et même quand la base est bonne il sauvegarde pas.
Marsh Posté le 01-07-2008 à 15:20:12
Le cache de requête
Pour tous ceux que ça intéresse, je viens de comprendre comment marcher le cache de requête. J'en fait tout de suite profiter tout le monde. Déjà, il faut savoir qu'il existe plusieurs fournisseurs de caches différents (tableau 19.1 page http://www.hibernate.org/hib_docs/ [...] ance-cache) , personnellement j'ai utilisé ehcache.
Le cache de requete se paramètre à plusieurs niveaux:
- dans le fichier de config de hibernate (ici le hibernate.cfg.xml)
- dans un fichier ehcache.xml dans le classpath
dans le fichier de config d'hibernate il faut activer le fournisseur de cache et définir les classes l'implémentant:
Code :
|
ensuite regler le fichier ehcache.xml
Code :
|
Marsh Posté le 02-07-2008 à 11:43:04
best practices
Voici l'ensmble des best practices que j'ai trouver sur le net, si vous avez des suggestion, ne vous gênez pas.
- la recherche d'un objet dans une table se fait toujours à l'aide d'un load ou get. Ceci permet de rechercher dan un premier temps dans le cache avant de rechercher dans la table. Il existe une différence fondamentale entre le load et le get. En cas d'objet non trouver dans la table le get retourne un objet null et le load soulève une exception.
exemple:
Code :
|
- Les criteria / criterions sont à utiliser de préférence pour les requêtes simples et le HQL dans le cadre de requête plus complexe.
Marsh Posté le 26-06-2008 à 11:06:17
Bonjour tout le monde,
Je suis actuellement entrain de réaliser la partie traitement de données d'une application web. Pour cela, j'ai décidé d'utiliser le duo Hibernate et PostGres. J'ai réaliser tout le traitement de donnée en utilisant les méthodes save, update et les criterions qui semblaient adaptés dans le cadre de requêtes simples. J'ai testé les performances de mes traitements à l'aide de tests unitaires en localhost (plus de 1000 fois chaque requête pour connaitre le temps de réponse moyen, sans vider le cache). Certaines requêtes mettent presque 1 seconde à l'exécution. J'ai chercher sur le net, j'ai remarqué que l'utilisation des deux caches de Hibernates (requête et secondaire) et la bonne gestion des sessions pouvaient aider à diminuer le temps d'exécution des requêtes récurrentes. Le seul problème, c'est que je n'arrive pas à trouver de tutorial clair expliquant l'utilisation de tout ça.
Dés lors, j'aimerais des conseils sur les domaines suivants:
- la gestion des session afin d'avoir une gestion des données multi-threader optimale
- la gestion du cache de premier niveau de hibernate
- la gestion du cache de second niveau de hibernate
- les best practices sur Hibernate
Voici les différentes sources qui vous permettrons de comprendre un peu comment tout cela marche
Le fichier de config de hibernate :
le fichier de mapping de Message :
la classe de gestion des sessions : (j'avouais que je l'ai rouver sur le net et que je l'ai pas encore vraiment retravailler)
le code permettant de creer un message :
(Je crois que c'est pas terrible ce que je fais la, le close connexion )
et le fichier de recherche de message :
Voila. Pouvez vous me donner vos commentaires et me donner des petits conseils? Merci
---------------
En informatique, il n'y a pa de solution, que des problèmes :)