10
votes

Quelle est la différence entre les caches L1 et L2 dans les applications Web avec Hibernate en tant que mécanisme ORM?

Je veux juste quelques informations générales sur le but standard d'utilisation de la cache L1 et de la cache L2.

Je suis curieux parce que je cherche le système avec TerreCrotta en tant que cache de 2e niveaux et j'ai constaté qu'il dispose également d'une cache de 1er niveau.


0 commentaires

6 Réponses :


0
votes

Si hibernate est quelque chose de similaire à NHibernate (ce qui est, à l'exception de l'autre sens), la session est le cache de premier niveau. Sauf que ce n'est pas une cache dans un sens général, mais plutôt une carte d'identité.


0 commentaires

4
votes

en JPA / hibernate (et d'autres outils d'ormes similaires), le cache L1 est le cache transactionnel I.e. Les entités stockées à partir de la transaction lorsque vous le fermez. Ceci n'est presque jamais un cache partagé (d'autres threads ne peuvent pas en utiliser). En JPA, cela serait généralement détenu par l'entitémanager.

Le cache L2 est un cache complet (typiquement) partagé. Si vous avez plusieurs threads / requêtes tirant dans des données, ils peuvent utiliser des entités déjà extraites par d'autres threads qui vivent toujours dans le cache. En JPA, cela se tiendrait généralement par l'entitémanageriserFactory.


0 commentaires

3
votes

Garyf n'est pas faux, mais n'est pas techniquement correct :-) Anton est plus correct à ce sujet, mais pour compléter sa réponse:

Cache de premier niveau: Il s'agit d'un "cache" qui stocke toutes les entités connues d'une session spécifique. Donc, si vous avez 3 transactions à l'intérieur de cette session, il conservera toutes les entités touchées par les trois transactions. Il est effacé lorsque vous fermez la session ou lorsque vous effectuez la méthode «Effacer».

Cache de deuxième niveau: Il s'agit d'un "vrai" cache et est délégué à un fournisseur externe, tel que INFINISPAN. Dans ce cache, vous avez le contrôle total sur le contenu du cache, ce qui signifie que vous êtes en mesure de spécifier quelles entrées doivent être expulsées, ce qui devrait être conservé plus longtemps et ainsi de suite.


3 commentaires

Pour le premier cache de niveau, que se passe-t-il lorsque le cache est plein? Vous avez mentionné deux cas où le cache est effacé mais je suis à peu près sûr qu'il est automatiquement effacé selon un algorithme «dernier utilisé» ou similaire lorsque le cache est rempli. Sinon, une exception hors mémoire se produirait, sinon rien ne serait stockable dans le cache après ce point.


Vous voudrez peut-être vérifier cela avec la documentation ou en vous expérimenter, mais aussi loin que je me souvienne, les entrées sur le cache du premier niveau ne sont jamais expulsées. Donc, si vous avez une transaction affectant une énorme quantité de données, vous pourriez en effet faire face à une exception hors mémoire (comme dans les opérations de lot). Pour ce cas "Edge", vous voudrez peut-être utiliser une sortie apatride ( docs.jboss.org/hibernate/ormir/3.6/javadocs/org/ibernate/... ).


"Si vous avez 3 transactions à l'intérieur de cette session" il est impossible pour les transactions distinctes (non imbriquées) car session n'est pas l'intention d'être utilisé avec plusieurs threads.



17
votes

Le cache L1 est le cache qui existe par session hibernate et ce cache n'est pas partagé entre les threads. Ce cache utilise sa propre mise en cache d'hibernate.

Le cache L2 est un cache qui survit au-delà d'une session hibernate et peut être partagé entre les threads. Pour ce cache, vous pouvez utiliser une mise en oeuvre de mise en cache avec hibernate comme EHCache ou autre chose comme JBosscache2


0 commentaires

0
votes

L1 Par défaut activé, vous devez ajouter une bibliothèque tierce partie comme EH Cache, Redis pour L2.

Vous ne pouvez pas désactiver L1 dans Hibernate.


0 commentaires

0
votes

L1: le cache du premier niveau est le cache par cache de session hibernate et est un cache obligatoire par lequel toutes les demandes doivent passer et ce cache n'est pas partagé entre les threads.

L2: Le cache de second niveau peut être configuré sur une base de collecte par classe et par collecte et principalement responsable des objets de mise en cache sur les sessions.L2 Cache est un cache qui survit au-delà d'une session hibernate et peut être partagé entre les threads.


0 commentaires