2010-02-10 4 views
2

Dans mon application Grails, certaines de mes classes de domaine ne seront jamais modifiées par les utilisateurs.Comment désactiver temporairement la stratégie d'hibernation du cache de deuxième niveau en lecture seule dans Grails?

Cependant, certains travaux de maintenance sont parfois nécessaires, et l'administrateur devrait être capable de créer/éditer quelques instances de temps en temps (disons deux fois par an). Je souhaite définir une stratégie de cache de second niveau en lecture seule pour ces classes de domaine (static mapping = { cache usage: 'read-only' }) ET je voudrais pouvoir "désactiver" (dans des situations très particulières) la stratégie de lecture seule afin de mettre à jour certaines instances via la vue d'édition de l'échafaudage Grails.

Est-ce possible? Que me conseillez-vous de faire?

EDIT: La solution que j'applique est un mélange de réponses Pascal et Burt (voir commentaires). Les deux réponses sont géniales et utiles. J'ai donc eu un dilemne pour choisir la réponse acceptée! En tout cas, merci.

Répondre

3

C'est probablement possible mais très probablement non-trivial. J'irais avec des insertions directes en utilisant groovy.sql.Sql. Vous perdez la validation, mais vous pouvez créer des instances et les valider sans appeler save(). Ensuite, faites les insertions SQL si elles sont correctes, par ex.

def thing = new Thing(params) 
if (thing.validate()) { 
    new Sql(dataSource).executeInsert(
      "insert into thing(name) values(?)", [params.name]) 
} 
else { 
    // report validation error 
} 
+0

Merci pour votre réponse. L'insertion de nouveaux objets fonctionnera mais lors de la mise à jour d'objets existants, je devrai "vider" le cache de 2ème niveau à droite? (parce que sinon les utilisateurs ne verront jamais le changement). Ai-je besoin d'utiliser la méthode expict() pour cela? – fabien7474

+1

Oui, excellent point. Ajoutez "def sessionFactory" à votre service et appelez sessionFactory.evict (YourDomainClass) pour effacer le cache de deuxième niveau après une insertion. –

3

j'effectuer la mise à jour sur les entités données en utilisant pur SQL et ensuite faire la méthode evict() nécessaire appelle le SessionFactory pour supprimer les entités spécifiques du cache de niveau 2. Notez que vous devrez peut-être supprimer des entités des collections également avec evictCollection(). Cochez cette case nice blog post pour plus de détails sur l'expulsion.

Encapsulez tout cela dans les services (par exemple wipeBooksFromGlobalCache()) que les administrateurs peuvent appeler dans les situations très particulières que vous évoquez.

+0

Bonjour Pascal. Je vais certainement devoir vider le cache de second niveau en utilisant la méthode evict(). Mais une fois expulsé, serai-je capable de mettre à jour l'instance existante avec une stratégie de cache en lecture seule? – fabien7474

+1

@ fabien7474 Un cache en lecture seule signifie qu'il n'est pas mis à jour, que les entités sont en lecture seule et ne peuvent pas être mises à jour. En d'autres termes, vous pouvez 1. mettre à jour les entités et 2. les expulser() pour qu'elles soient rechargées dans le cache de second niveau (c'est-à-dire pour rendre les modifications "visibles"). –

+0

Merci beaucoup! Je l'ai! – fabien7474

Questions connexes