-
Gestion des sessions ?
Bonjour,
Lorsque je charge des données dans mes tables après avoir démarrer mon serveur applicatif, et après avoir charger les données une première fois, si j'essaie de les recharger à nouveau, Hibernate prends parfois ou ne prends pas compte des nouvelles données (apparemment c'est aléatoire), je dois faire un stop/start de mon serveur.
J'ai essayé, lorsque je récupère un objet, de faire session.refresh(objet). Ca fonctionne bien, mais je ne peux pas l'utiliser ainsi lorsque j'utilise un Query qui me renvoie une collection, dont certains éléments sont manquants (car venant d'être rajouté en table).
Je suppose que c'est un problème de cache, et après recherche j'avoue que je suis perdu sur la façon de procédé pour que ces données soient prises en compte dès qu'elles ont été rajoutées en table.
Je précise que les données rajoutées en table le sont via la même application (et donc via Hibernate également) qui lit ces données.
Merci pour toute aide, et n'hésitez pas à me demander plus de détails :)
-
Rebonjour,
Je parviens à avoir les données bien à jour via un session.clear(). De là, j'ai une autre question.
Dans le cadre d'une application web multi-utilisateurs, j'aimerais avoir des avis concernant une gestion efficace des sessions Hibernate.
- Faut-il avoir une seule session pour tous ? Dans ce cas, si chez un session.clear() arrive chez un utilisateur, quel impact pour les autres qui peuvent être en plein milieu d'un traitement ?
- Faut-il en avoir une pool ? Si oui, quelle proportion par rapport au nombre d'utilisateurs ?
- Faut-il en prévoir une par utilisateur ? Dans ce dernier cas, comment implémenter une bonne solution ?
Merci d'avance pour vos réponses !
-
Bonjour Thomzon,
le session.clear() que tu effectues ne porte normalement que sur le cache de niveau 1 de la session courante. C'est à dire que l'ensemble des autres sessions n'est pas affecté par ce clear.
Je pense qu'il serait plus judicieux pour toi de faire un session.flush() qui met à jour les données de la session par rapport à la base (pas d'objet à préciser, il les fait tous), contrairement à clear() qui vide la session et oblige Hibernate à tout recharger (si j'ai bien tout compris, parce que j'ai tout lu Freud).
Je ne sais s'il est possible d'impacter l'ensemble des sessions de ton application. Je sais néanmoins que tu peux travailler sur le cache de niveau 2, qui lui touche toutes les sessions. Mais est-ce vraiment ce que tu veux faire...
MiniMarch
-
Merci pour la réponse,
J'ai essayé le flush(), mais j'avais toujours le même soucis.
Concernant la gestion de session, un conseil à me donner ?
-
Concernant la gestion des sessions, je dois avouer que je vais être un peu plus limité au niveau des conseils. Je viens de m'attaquer au problème, et je ne maîtrise encore qu'assez peu le sujet.
Comme je te le disais précédemment, je ne pense pas qu'il faille voir le problème sous forme de sessions (peut être que quelqu'un de plus calé que moi te diras le contraire, crois-le sur parole), mais sous forme de caches.
Est-ce que les informations chargées par Hibernate ont de forte chance d'être partagée entre les sessions ? Est-ce que les informations chargées sont spécifiques aux sessions ? Autrement dit, est-ce que le cache de niveau 1 est plus adapté que celui de niveau 2 ?
Je crois qu'une fois que tu auras répondu à ces questions, tu pourras y voir plus clair. Mais encore une fois, je ne maîtrise pas forcément très bien le sujet, et il se peut que je ne tienne pas compte de certaines informations.
Petite précision quant à l'utilisation de flush() : elle doit évidemment être utilisée avant le clear() et au court de la même session utilisateur.
Si tu ne connaissais pas le site de la doc Hibernate, je te conseille de jeter un coup d'oeil à la page suivante :
http://www.hibernate.org/hib_docs/v3/reference/fr/html/
peut-être également : http://www.hibernate.org/hib_docs/v3...state-flushing concernant plus ton problème courant.
ou encore http://www.hibernate.org/hib_docs/v3...-cacheprovider pour les caches.
MiniMarch
-
Merci pour ces réponses.
A vrai dire, j'ai lu cette doc, et bien que le flush() devrait théoriquement résoudre mon problème de rafraichissement des données, il n'en est rien, et je ne parviens à un bon résultat qu'avec un clear().
-
La session hibernate doit avoir une durée de vie très courte.
Tu ouvres ta session, tu effectues tes traiments, tu fermes ta session.
En faisant ainsi, tu n'auras pas besoin d'utiliser de session.clear() ou session.flush(), tes données seront à jour.
Pour ce qui est du cache de niveau 2, vois ça plutôt comme une optimisation.
Règle déjà des problèmes de sessions.
-
Bonjour,
J'ai essayé au début de faire un sessionFactory.openSession() pour chacune de mes opérations, et j'ai trouvé les performances très faibles (même si effectivement ça règlait mon problème de données). Sachant que j'ai beaucoup de requête, es-tu sûr que c'est la solution à utiliser ? Ou bien je n'ai pas compris ?
-
Je ne dis pas d'ouvrir une nouvelle session à chaque opération, mais plutôt pour un ensemble d'opérations, regroupées dans une transaction.
J'ai toujours procédé comme ça avec Hibernate et je n'ai pas eu de problème de performances, même avec beaucoup de données.