2012-05-30 5 views
0

J'utilise Hibernate avec son cache L1 (Session) uniquement. Je me demandais s'il était possible de le pré-peupler.Cache Hibernate L1 prérempli

Supposons que j'ai une table Item, où chaque élément a son propre id, et je dois émettre des requêtes comme « from Item where id = :id »: si je pouvais effectuer une pré-charge tous les éléments à la fois que je pourrais avoir plus rapide temps de réponse (je m en utilisant Hibernate depuis une servlet sous Tomcat).

+0

Le cache de session est un cache de très courte durée, dont la durée de vie est généralement la durée de vie d'une transaction unique: quelques millisecondes et qui n'est pas partagée entre plusieurs threads concurrents. Si vous avez besoin d'obtenir presque tous vos articles par ID dans une transaction, alors oui, vous pouvez pré-charger tous les articles. Sinon, je ne vois pas le point. –

+0

En lisant cet article (https://community.jboss.org/wiki/UsingHibernateWithTomcat), j'avais compris qu'il fallait laisser une session ouverte pour tout le cycle de vie d'une servlet, ce qui pourrait durer bien plus que quelques secondes ... – cdarwin

+0

Je ne peux pas accéder à cet article, mais voici ce que la documentation officielle d'Hibernate dit à propos de Session: * Un objet monothread de courte durée représentant une conversation entre l'application et le stockage persistant. Enveloppe une java.sql.Connection JDBC. * –

Répondre

-1

Oui, c'est possible. Vous exécutez votre sélection une fois (sans condition et sans utiliser la liste résultante), puis les données sont dans le cache de premier niveau de la session jusqu'à ce que vous effaciez la session ou la jetiez.

Mais dans ce cas vous n'avez aucun contrôle si la session elle-même jette les données préchargées de son cache (ce n'est pas un problème fonctionnel, seulement un problème de performance, et j'ai l'impression la version d'hibernation m en utilisant ne le fait jamais). Si vous souhaitez avoir un contrôle total, stockez les données préchargées dans une variable statique (une instance List ou Map) et écrivez un service qui lit à partir de cette variable statique à la place de la base de données. D'ailleurs, dans votre environnement, l'accès à cette variable statique doit être synchronisé.

+4

C'est une chose très dangereuse à faire, puisque vous pouvez renvoyer des données périmées. Si vous souhaitez mettre en cache des éléments pour plusieurs sessions/transactions, il vaut mieux utiliser le cache de second niveau Hibernate: il serait transparent et serait mis à jour lors de la modification d'un élément. Pourquoi réinventer la roue? –

+0

Si elle est mise en cache en lecture seule, elle n'est pas dangereuse (faites attention avec un chargement paresseux, c'est-à-dire chargez tout ou ne fermez pas la session). Les modifications après la fermeture de la session ne sont pas possibles, les modifications simultanées par les différents threads ne sont pas non plus (tous appartiennent à la même session, et la session d'hibernation n'est pas adaptée aux threads). Mais tout cela est impliqué par la question, qui était pour le cache L1. – Johanna

+0

Je parlais de votre conseil de stocker les données préchargées dans une liste ou une carte statique. Vous feriez mieux d'utiliser le chache L2 au lieu de mettre en place le vôtre. –