2009-09-09 16 views
1

Je me demande s'il est possible pour le cache de second niveau Hibernate (nous utilisons EHCache) de permettre à une application de mettre en cache une entité qui a été ajoutée à la DB si elle sait d'autres applications modifient la base de données. Je pense que si je mets à jour l'enregistrement A, je connais la valeur de l'enregistrement A et que je devrais pouvoir le mettre en cache, les systèmes de cluster JVM comme Terracotta supportent ce type de comportement en mémoire JVM avec les verrous de synchronisation Java. .Hibernate cache de second niveau ne cache pas les entités validées

EHCache lock mode configuration in Hibernate

+1

Pouvez-vous clarifier ce que vous essayez de faire? Demandez-vous comment mettre en cache manuellement les entités après la fusion de telle sorte qu'Hibernate les utilise lors d'appels get() ultérieurs? Un échantillon de code ou une description plus détaillée du problème aiderait. – ChssPly76

Répondre

2

Etat de l'art POJO est dans les pourparlers de livre d'action à ce sujet

Si une application unique serveur met à jour la base de données en utilisant le framework de persistance, le cadre met à jour le cache au niveau du processus.

Et ...

objets qui sont mises en cache actualisable doivent généralement utiliser le verrouillage optimiste car qui empêchera l'application écrasements aveuglément des changements dans la base de données. ET si une transaction met à jour un objet mis en cache qui a déjà été modifié dans la base de données, l'échec de verrouillage optimiste entraînera l'annulation de la transaction. Le cadre de persistance supprime les données périmées du cache et l'application peut réessayer la transaction avec la dernière version des données.

Et choisissez l'une des stratégies suivantes en fonction JPA avec Hibernate livre

  • transactionnelles: disponible dans un environnement géré seulement, il garantit la pleine isolement transactionnel à lecture répétée, si nécessaire. Utilisez cette stratégie pour lecture de données pour la plupart où il est essentiel d'empêcher les données obsolètes dans les transactions concurrentes, dans le cas rare d'une mise à jour. Lecture-écriture: Cette stratégie maintient l'isolation validée en lecture, en utilisant un mécanisme d'horodatage et n'est disponible que dans les environnements non-cluster. Encore une fois, utilisez cette stratégie pour les données lues principalement, où il est essentiel d'empêcher les données obsolètes dans les transactions concurrentes, dans le cas rare d'une mise à jour.

Ajouté à anwser d'origine: Hibernate NE GARANTIT PAS la cohérence entre le cache et la base de données que vous utilisez @Cache (utilisation = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE). Si vous voulez l'utiliser, vous DEVREZ donc configurer un délai d'expiration suffisamment court qui peut affecter la performance.

salutations,

+0

L'utilisation de @Cache (usage = CacheConcurrencyStrategy.READ_WRITE) au lieu de @Cache (usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) a permis à EHCache de ne pas invalider après la mise à jour d'une entité. Je ne suis pas sûr de ce que les pénalités de performance sont en utilisant READ_WRITE versus NONSTRICT_READ_WRITE. Nous sommes également loin dans le projet pour permettre un verrouillage optimiste en utilisant la colonne de version et les horodatages, mais cela semble également être une bonne solution. – Dougnukem

+0

Merci, Prenez soin des problèmes de performances lors de l'utilisation des capacités de cache.Demain, je vais vous donner un aperçu supplémentaire à ce sujet. –