Hibernate stratégie de cache
-
11-09-2019 - |
Question
Comment puis-je choisir CacheConcurrencyStrategy
à utiliser?
-
NonstrictReadWriteCache
, -
ReadOnlyCache
, -
ReadWriteCache
, -
TransactionalCache
.
Je lis https: //www.hibernate. org / hib_docs / v3 / api / org / mise en veille prolongée / cache / CacheConcurrencyStrategy.html , mais n'explique pas assez en détail.
La solution
Le Hibernate documentation fait un très bon travail à les définir:
19.2.2. Stratégie: lecture seule
Si votre application a besoin de lire, mais pas modifier, les instances d'une persistante classe, peut être utilisé une seule cache de lecture. Ceci est le plus simple et optimale stratégie performante. Il est même sûr pour une utilisation dans un cluster.
19.2.3. Stratégie: lecture / écriture
Si l'application doit mettre à jour données, un cache de lecture-écriture peut être approprié. Cette stratégie de cache ne doit jamais être utilisé si sérialisable niveau d'isolement de la transaction est Champs obligatoires. Si le cache est utilisé dans un environnement JTA, vous devez spécifier la propriété
hibernate.transaction.manager_lookup_class
et nommer une stratégie pour obtenir leTransactionManager
JTA. En d'autre environnements, vous devez vous assurer que la transaction est terminée lorsqueSession.close()
ouSession.disconnect()
est appelé. Si vous utiliser cette stratégie dans un cluster, vous devez vous assurer que la la mise en œuvre du cache sous-jacente supports de verrouillage. Le cache intégré les fournisseurs ne supportent pas le verrouillage.19.2.4. Stratégie: nonstrict lecture / écriture
Si l'application de temps en temps besoins si elle est de mettre à jour des données (à savoir extrêmement improbable que deux transactions essaient de mettre à jour le même article simultanément), et stricte l'isolement de la transaction n'est pas nécessaire, un cache lecture-écriture non stricte pourrait être approprié. Si le cache est utilisé dans un environnement JTA, vous devez spécifier
hibernate.transaction.manager_lookup_class
. Dans d'autres environnements, vous devriez veiller à ce que la transaction est complété lorsqueSession.close()
ouSession.disconnect()
est appelé.19.2.5. Stratégie: transactionnelle
La stratégie de cache transactionnel fournit un support pour pleinement les fournisseurs de cache transactionnels tels que JBoss TreeCache. Un tel cache ne peut être utilisé dans un environnement JTA et vous doit préciser
hibernate.transaction.manager_lookup_class
.
En d'autres termes:
-
en lecture seule: Utile pour les données lire fréquemment, mais jamais mis à jour (par exemple données de référence comme pays). C'est simple. Il a les meilleures performances de tous (évidemment).
-
Lecture / écriture: Souhaitable si vos besoins de données mise à jour . Mais il ne fournit pas un href="http://en.wikipedia.org/wiki/Isolation_%28database_systems%29#SERIALIZABLE", fantôme lit peut se produire (vous pouvez voir à la fin d'une transaction de quelque chose qui était pas là au début). Il a plus que les frais généraux en lecture seule.
-
nonstrict lecture / écriture: Sinon, s'il est peu probable deux threads individuels de transaction pourraient mettre à jour le même objet, vous pouvez utiliser la stratégie nonstrict-read-écriture. Il a moins de frais généraux que lecture-écriture. Celui-ci est utile pour les données qui sont rarement mis à jour .
-
transactionnelles: Si vous avez besoin d'un entièrement transactionnel cache. Convient uniquement dans un environnement JTA.
Ainsi, le choix de la bonne stratégie dépend du fait que les données sont mises à jour ou non, la fréquence des mises à jour et le niveau d'isolation requis. Si vous ne savez pas comment répondre à ces questions pour les données que vous souhaitez mettre en cache, peut-être demander un soutien d'un DBA.
Autres conseils
READ_ONLY: Utilisé uniquement pour les entités qui ne changent jamais (exception est levée si une tentative de mettre à jour une telle entité est faite). Il est très simple et performant. Très approprié pour certaines données de référence statique qui ne change pas.
NONSTRICT_READ_WRITE: Cache est mis à jour après une transaction qui a changé les données affectées a été commise. Ainsi, une forte cohérence est pas garantie et il y a une petite fenêtre de temps dans lequel les données périmées peuvent être obtenues à partir du cache. Ce genre de stratégie convient pour les cas d'utilisation qui peuvent tolérer la cohérence éventuelle.
READ_WRITE: Cette stratégie garantit une forte cohérence dont il réalise en utilisant des verrous « soft »: Lorsqu'une entité en cache est mis à jour, un verrouillage logiciel est stocké dans le cache pour cette entité et, ce qui est libéré après la transaction est validée. Toutes les transactions simultanées qui ont accès à des entrées verrouillées souples récupéreront les données correspondantes directement la base de données.
TRANSACTION: modifications du cache sont effectuées dans les transactions XA distribués. Un changement dans une entité en cache est soit validée ou annulée dans les deux bases de données et le cache dans la même transaction XA.
API de lecture Docs est une bonne chose, mais vous devriez aussi lire la documentation (son impressionnante) aussi, cache de second niveau -. stratégies
-
Transactionnel -. Utilisez cette stratégie pour principalement en lecture des données où il est essentiel d'éviter que des données périmées dans les transactions simultanées, dans les rares cas d'une mise à jour
-
lecture-écriture -. Encore une fois utiliser cette stratégie pour principalement en lecture des données où il est essentiel d'éviter que des données périmées dans les transactions simultanées, dans les rares cas d'une mise à jour
-
nonstrict-lecture-écriture - Cette stratégie ne garantit pas de cohérence entre le cache et la base de données. Utilisez cette stratégie si les données changent presque jamais et une faible probabilité de données périmées ne sont pas une préoccupation critique.
-
Lecture seule - Une stratégie appropriée pour les données concurrency, qui ne change jamais. Utilisez-le pour les données de référence seulement.
Espérons que cela efface le doute!