web-dev-qa-db-fra.com

Caching avec hibernate + printemps - quelques questions

Je travaille sur le développement d'une application Web avec le printemps 3 et Hibernate 3.6. Pour le moment, j'essaie de comprendre comment la mise en cache avec le printemps et l'hibernate fonctionne. J'ai trouvé des sources sur la mise en cache avec hibernate et certaines sur le printemps et j'essaie d'apporter mes informations ensemble maintenant. J'ai encore des questions aux deux cadres et je serais heureux que quelqu'un puisse y répondre ou me dire si les faits énumérés ici sont corrects.

La plupart du temps, de courtes réponses (oui/non) seraient suffisantes. Je pense que cette liste peut également être utile aux autres, qui veulent comprendre la mise en cache avec des œuvres de printemps et d'hibernate.

General

1) Hibernate prend en charge les caches suivantes: cache de 1er niveau, cache de 2e niveau, cache de requête

2) Spring lui-même soutient les possibilités de mise en cache suivantes: juste la mise en cache de méthode

1st Level Cache

) Le cache du 1er niveau fait partie de chaque application hibernate.

4) Le cache de 1er niveau est créé pour chaque session hibernate.

5) Qu'est-ce qui est enregistré dans le cache du 1er niveau? Objets ou juste les valeurs de leurs propriétés? Queries et leurs résultats?

2nd Level Cache

6) J'ai découvert: le cache de 2e niveau est utilisé une fois par application. n'est-ce pas faux? N'est-il pas utilisé une fois par SessionFactory? et: multiple de sessionFactorys = plusieurs caches de 2e niveau possibles?

7) Qu'est-ce qui est enregistré dans le cache de 2e niveau: À mon avis, les valeurs appartenant à un enregistrement, pas les objets eux-mêmes.

8) Lorsque vous stockez des valeurs d'un enregistrement dans le cache de 2e niveau, il est possible de stocker des valeurs associées (d'objets connectés sur une clé étrangère) avec elle aussi?

9) Lors de la mise à jour des valeurs d'un objet dans le cache de 2e niveau, il est possible de mettre à jour les valeurs des objets connectés à celui-ci dans le cache aussi?

10) Lorsque des valeurs d'un objet changent, comment puis-je mettre à jour le cache de 2e niveau? affleurer? Puis-je simplement mettre à jour une partie du cache ou le cache entier doit-il être mis à jour?

11) où le cache de 2e niveau a-t-il un sens et où n'est-ce pas?

12) Le mode de cache: Chaque mode de cache fournit-il une stratégie de mise en cache différente? Par exemple, avec le mode de cache "Lecture seule", aucune synchronisation de la base de données et du cache n'est jamais nécessaire? Les autres modes de cache fournissent-ils la synchronisation? Je pensais que la synchronisation doit être faite par le développeur lui-même?

Query Cache

13) Quelle est la différence entre le cache de requête et le cache de 2e niveau? À mon avis: dans les ensembles de résultats cache de requête sont enregistrés, mais pas avec leurs valeurs, juste avec leurs identifiants. Lorsque la requête est utilisée à nouveau et que le jeu de résultats est toujours "correct", les valeurs appartenant aux ID sont interrogées à partir du cache de 2e niveau.

14) Pour le cache de requête, un cache de 2e niveau doit être utilisé?

15) Où le cache de requête a-t-il un sens et où n'est-ce pas?

Spring

16) Le ressort fournit-il plus de possibilités de mise en cache que la mise en cache de méthode?

17) La mise en cache de méthode n'est pas liée à la mise en cache hibernate

18) Mais: Pour la mise en cache de méthode, le 2ème niveau est nécessaire, comme EHCache (qui peut être utilisé par Hibernate aussi)

19) La mise en cache de méthode peut-elle être utilisée sans requêtes de base de données?

Getting mixed up

20) Si vous utilisez EHCache pour Hibernate sous forme de cache de 2e niveau et EHCache pour le ressort pour la mise en cache de méthode, puis-je utiliser la même instance EHCache? Y a-t-il une chance que quelque chose soit mélangé?

21) Lorsque vous utilisez le cache de 1er niveau et le cache de 2e niveau, peuvent-ils être mélangés? Lorsque vous interrogez la base de données, où le résultat provient-il, le cache du 1er ou 2ème niveau? Le cache du 1er niveau fonctionne-t-il avec le cache de 2e niveau?

22) autre chose qui peut être mélangé en utilisant les caches que j'ai mentionnées? :-)

Merci d'avoir répondu, peu importe quelle question! :-)

62
nano7

Mise en veille prolongée prend en charge les Caches suivants: 1er niveau du cache, 2e niveau du cache, cache de requêtes

Oui.

Le printemps lui-même soutient les possibilités de mise en cache suivantes: juste Méthode Caching

Printemps 3.1 introduit la nouvelle abstraction de la mise en cache basée sur les annotations autour des méthodes, oui.

Le 1er niveau du cache fait partie d'application CHAQUE Hibernate.

Oui.

Le 1er niveau du cache est créé pour mise en veille prolongée de session TOUS.

Oui, mais vous pouvez effacer manuellement à tout moment donné.

Ce qui est enregistré dans le 1er niveau du cache? Objets ou juste les valeurs de leurs propriétés? Queries et leurs résultats?

Il est une carte de tous les objets alla chercher pendant la durée d'une session, si vous chargez le même objet par id pour la deuxième fois, il sera chargé de L1.

J'ai découvert: le 2e niveau du cache est utilisé une fois par application. n'est-ce pas faux? est pas utilisé une fois par SessionFactory? et: multiple de sessionFactorys = plusieurs caches de 2e niveau possibles?

Vous avez raison, généralement il y a juste une usine de session par application (base de données), d'où le raccourci.

ce qui est enregistré dans le 2e niveau du cache: à mon avis seulement les valeurs appartenant à un enregistrement, et non les objets lui-même.

Les mêmes choses que dans L1, mais ils vivent plus longtemps. L2 est généralement soutenue par une cache de puissance industrielle, tandis que L1 est juste une carte (il n'a même pas être thread-safe). Il stocke des entités complètes, y compris les relations paresseusement chargées.

lors de l'enregistrement des valeurs d'un enregistrement dans le 2e niveau du cache, il est possible de stocker des valeurs connexes (à partir d'objets connectés sur une clé étrangère) avec elle aussi?

Vous ne parvenez pas L2 manuellement, il se fait automatiquement.

lors de la mise à jour des valeurs d'un objet dans le cache de niveau 2, il est possible de mettre à jour les valeurs des objets qui lui sont liées dans le cache aussi?

Voir au dessus.

lorsque les valeurs d'un objet changent, comment puis-je mettre à jour le cache de niveau 2? affleurer? Puis-je simplement mettre à jour une partie du cache ou le cache entier doit-il être mis à jour?

Voir ci-dessus - Hibernate comprendre cela pour vous. Vous n'interagissez avec L2 directement.

d'où vient le 2ème cache de niveau du sens et où il ne marche pas?

Mesure. En application qui a lu beaucoup de données par clé primaire et facteur lecture à écriture est très élevé, L2 a un impact significatif sur vos performances.

le mode Cache: Chaque mode cache constitue une autre stratégie de mise en cache? par exemple avec le mode cache " lecture seule " aucune synchronisation de base de données et le cache est toujours nécessaire? Les autres modes de cache fournissent-ils la synchronisation? Je pensais que la synchronisation doit être faite par le développeur lui-même?

Mode cache aide Hibernate à choisir la meilleure stratégie pour la mise en cache et invalidante. Par exemple, si le cache est en lecture seule, Hibernate pas la peine invalidant (ou il ne le fera pas que, souvent). Mais en lecture seule cache (lecture seule entité) sera d'interdire toute mise à jour bien sûr.

quelle est la différence entre le cache de requêtes et le 2e niveau du cache? À mon avis: dans les ensembles de résultats cache de requête sont enregistrés, mais pas avec leurs valeurs, juste avec leurs identifiants. lorsque la requête est utilisée à nouveau et le jeu de résultats est encore " correct ", les valeurs appartenant aux ids sont interrogés à partir du 2e niveau du cache.

Exactement, mais cela est un sujet très large. En particulier, le jeu de résultats est toujours " correct " partie.

Pour le cache de requêtes un 2e niveau du cache DOIT être utilisé?

Oui, sans le cache L2, le cache de requête n'a pas de sens et va ralentir considérablement l'application.

d'où vient le sens de make cache de requêtes et où il ne marche pas?

Question difficile, généralement lorsque vous exécutez la même requête beaucoup de fois et l'univers des paramètres de requête est faible (pour chaque ensemble de paramètres de requête nouveau cache de requête est créé avec tous les identifiants d'enregistrements étant les résultats).

Est-ce printemps plus de possibilités de fournir que la mise en cache de mise en cache méthode?

Non, Le printemps est plus ou moins juste une colle pour votre propre code.

la mise en cache de la méthode est pas liée à la mise en cache mise en veille prolongée.

Le printemps est pas lié à Hibernate, alors ...

mais: pour la méthode de mise en cache un 2ème niveau est nécessaire, comme ehcache (qui peut être utilisé par mise en veille prolongée aussi)

L2 est un concept Hibernate. Si vous voulez des méthodes de cache, vous avez besoin n pe cache sous-jacent. Que ce soit ehcache, jamais l'esprit. Bien sûr, il doit être thread-safe.

la mise en cache peut être utilisée sans méthode des requêtes de base de données?

Le printemps n'a rien à voir avec Hibernate. Vous pouvez mettre en cache des calculs qui ont rien à voir avec la base de données.

si vous utilisez ehcache pour mise en veille prolongée comme 2ème cache de niveau et ehcache pour le printemps pour la mise en cache de la méthode, puis-je utiliser le même ehcache instance? Y a-t-il une chance que quelque chose soit mélangé?

Vous pouvez utiliser le même CacheManager et la configuration du cache comme Hibernate pour faciliter le déploiement. Tant que les noms de cache ne se chevauchent pas, ils sont totalement indépendants, a même pensé à travailler dans le même gestionnaire.

lorsque vous utilisez le 1er cache de niveau et cache de niveau 2, peuvent-ils se mélanger? Lorsque vous interrogez la base de données, où le résultat provient-il, le cache du 1er ou 2ème niveau? Le cache du 1er niveau fonctionne-t-il avec le cache de 2e niveau?

Ils travaillent juste, tant que certaines abstractions ne fuient pas :-). Lorsque vous interrogez par clé primaire, le premier L1 est examiné (il est plus rapide), puis L2.

quelque chose d'autre qui peut être mélangé en utilisant les caches que j'ai mentionnées? :-)

Voir ci-dessus, les abstractions ont tendance à fuir. Mais les pires problèmes arrivent lorsque vous modifiez la base de données et Hibernate n'en savent pas. Le regroupement également sans réplication correcte vous causera un mal de tête. Et le plus gros problème - la mise en cache très souvent incorrecte ralentit réellement l'application (le cache de requête est le plus dangereux ici).

74
Tomasz Nurkiewicz