Question

Je me demande s'il est possible pour le cache de second niveau d'Hibernate (nous utilisons EHCache) d'autoriser une application à mettre en cache une entité qui a été validée dans la base de données si elle sait qu'aucune autre application ne modifie la base de données.

Je pensais que si je mettais à jour l'enregistrement A, je connaissais sa valeur et je devais pouvoir le mettre en cache. Les systèmes de mise en cluster JVM tels que Terracotta prennent en charge ce type de comportement en termes de mémoire de tas JVM utilisant des verrous de synchronisation Java.

configuration du mode de verrouillage EHCache dans Hibernate

Était-ce utile?

La solution

Le livre en action de POJO à la pointe de la technologie en parle

  

Si une application à serveur unique met à jour la base de données à l'aide de la structure de persistance, celle-ci met à jour le cache au niveau du processus.

Et ...

  

Les objets mis en cache qui peuvent être mis à jour doivent généralement utiliser un verrouillage optimiste, car cela empêchera l'application d'écraser aveuglément les modifications apportées à la base de données. ET si une transaction met à jour un objet mis en cache qui avait déjà été modifié dans la base de données, l'échec du verrouillage optimiste entraînera l'annulation de la transaction. La structure de persistance supprimera les données obsolètes du cache et l'application pourra relancer la transaction avec la dernière version des données.

Et choisissez l'une des stratégies suivantes selon JPA avec Hibernate book

  • Transactionnel: disponible uniquement dans un environnement géré, il garantit une isolement transactionnel jusqu'à lecture répétable, si nécessaire. Utilisez cette stratégie pour lire principalement des données là où il est essentiel d'éviter les données périmées dans les transactions simultanées, dans les rares cas de mise à jour.
  • Lecture-écriture: cette stratégie maintient l'isolement en lecture seule, en utilisant un horodatage. mécanisme et est disponible uniquement dans les environnements non clusterisés. De nouveau, utilisez cette stratégie pour les données principalement lues, là où il est essentiel d’éviter la perte de données périmées dans des transactions simultanées, dans le cas rare d’une mise à jour.

Ajouté à la réponse originale: Hibernate NE GARANTIT PAS la cohérence entre le cache et la base de données, que vous utilisiez @Cache (usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE). Si vous souhaitez l’utiliser, vous DEVEZ donc configurer un délai d’expiration suffisamment court pour que la performance en soit affectée.

salutations

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top