Come disabilitare temporaneamente la strategia in letargo di cache di 2 ° livello di sola lettura in Grails?
-
19-09-2019 - |
Domanda
Nella mia applicazione Grails, alcune delle mie classi di dominio non saranno mai cambiate dagli utenti.
Tuttavia, a volte sono necessari alcuni lavori di manutenzione e l'amministratore dovrebbe essere in grado di creare/modificare poche istanze di volta in volta (diciamo due volte l'anno).
Vorrei impostare una strategia di cache di 2 ° livello di sola lettura per queste classi di dominio (static mapping = { cache usage: 'read-only' }
) E vorrei essere in grado di "disabilitare" (in situazioni molto particolari) la strategia di sola lettura al fine di utilizzare alcune istanze tramite la vista di modifica delle impalcature di Grails.
È possibile? Cosa mi consigli di fare?
MODIFICARE: La soluzione che sto implementando è un mix di risposte Pascal e Burt (vedi commenti). Entrambe le risposte sono fantastiche e disponibili. Quindi ho ricevuto un dilemna per aver scelto la risposta accettata! Comunque grazie.
Soluzione
È probabilmente possibile ma molto probabilmente non banale. Andrei con inserti diretti usando groovy.sql.sql. Perdi la convalida, ma potresti creare istanze e convalidarle ma non chiamare Save (). Quindi fai gli inserti SQL se sono ok, ad es.
def thing = new Thing(params)
if (thing.validate()) {
new Sql(dataSource).executeInsert(
"insert into thing(name) values(?)", [params.name])
}
else {
// report validation error
}
Altri suggerimenti
Eseguirei l'aggiornamento sulle entità fornite utilizzando puro SQL e poi fai il richiesto evict()
Metodo chiama sul file SessionFactory
Per rimuovere le entità specifiche dalla cache di 2 ° livello. Si noti che potrebbe essere necessario rimuovere anche le entità dalle collezioni evictCollection()
. Verificare questo Bel post sul blog Per dettagli sullo sfratto.
Incapsulare tutto questo nei servizi (ad es. wipeBooksFromGlobalCache()
) di quanto gli amministratori possano chiamare nelle situazioni molto particolari che stai menzionando.