2009-12-01 4 views
0

pour le premier niveau de cache, ce que je comprends est quand nous faisons saveorupdate, nous avons besoin d'appeler flush() pour actualiser le cache afin de sélectionner ultérieurement requête de DB. Donc, pour une application utilisant Hibernate, nous ne doit pas modifier les enregistrements/supprimer des enregistrements en utilisant DB-GUI sans passer par Hibernate car le select demandera un mauvais résultat à cause du cache. correct?cache hibernate de premier niveau, modifier l'enregistrement directement à DB

Répondre

3

Incorrect. Le cache de 1er niveau est toujours cohérent avec lui-même et cohérent avec les mises à jour effectuées dans cette session. Lorsque la session est fermée, toutes les mises à jour restantes sont automatiquement vidées, vous devez très rarement appeler le flush(). En outre, le cache de 1er niveau ne dure que pendant la durée de la session d'hibernation (qui ne dure généralement que quelques instructions SQL, et dure généralement moins d'une seconde), de sorte que toute mise à jour effectuée directement dans la base de données être reflété dans la prochaine session d'hibernation qui commence.

+0

Que diriez-vous pour le cache de niveau 2. Je suis sûr que si je modifie directement les enregistrements dans la base de données, l'application Hibernate sera toujours en train de retriver du cache sans le savoir? – cometta

+1

Oui, cela peut être vrai pour le cache L2, mais votre question parlait du cache L1 (session). il est très important de distinguer les deux, les comportements sont très différents. – skaffman

+0

Et 'CacheMode' est juste pour ça. –

1

Si FlushMode est défini sur Auto, il doit être vidé avant d'effectuer toute requête HQL ou critère susceptible d'être affectée. Si vous effectuez des requêtes SQL (ou que vous effectuez des requêtes HQL et que FlushMode n'est pas automatique), vous devrez vider, sinon les modifications ne seront pas reflétées dans la base de données lors de l'exécution de la requête SQL.

En outre, si vous n'utilisez pas une transaction, vous devrez appeler flush avant de disposer de la session.

Check this out https://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html

Questions connexes