Como desativar temporariamente a estratégia de hibernação de cache de cache de cache somente leitura em Grails?
-
19-09-2019 - |
Pergunta
No meu aplicativo Grails, algumas das minhas classes de domínio nunca serão alteradas pelos usuários.
No entanto, às vezes é necessário algum trabalho de manutenção, e o administrador deve ser capaz de criar/editar poucas instâncias de tempos em tempos (digamos duas vezes por ano).
Eu gostaria de definir uma estratégia de cache de 2º nível somente leitura para essas classes de domínio (static mapping = { cache usage: 'read-only' }
) E eu gostaria de poder 'desativar' (em situações muito específicas) a estratégia somente leitura, a fim de utilizar algumas instâncias por meio da visualização de edição de andaimes do Grails.
É possível? O que você me aconselha a fazer?
EDITAR: A solução que estou implementando é uma mistura de respostas Pascal e Burt (consulte os comentários). Ambas as respostas são ótimas e úteis. Então, eu recebi um dilemna para escolher a resposta aceita! Enfim, obrigado.
Solução
Provavelmente é possível, mas provavelmente não trivial. Eu iria com inserções diretas usando groovy.sql.sql. Você perde a validação, mas pode criar instâncias e validá -las, mas não ligue para salvar (). Então faça as inserções do SQL se eles estiverem bem, por exemplo,
def thing = new Thing(params)
if (thing.validate()) {
new Sql(dataSource).executeInsert(
"insert into thing(name) values(?)", [params.name])
}
else {
// report validation error
}
Outras dicas
Eu realizaria a atualização das entidades dadas usando SQL puro e então faça o necessário evict()
Método chama o SessionFactory
Para remover as entidades específicas do cache do 2º nível. Observe que você pode ter que remover entidades das coleções também com evictCollection()
. Verifique isso Boa postagem no blog Para detalhes sobre despejo.
Encapsular tudo isso em serviços (por exemplo wipeBooksFromGlobalCache()
) do que os administradores pode chamar as situações muito específicas que você está mencionando.