que tienen una situación extraña que parece indicar un problema GORM Cacheing¿Alguna vez necesito enjuagar explícitamente GORM guardar llamadas en griales?
//begin with all book.status's as UNREAD
Book.list().each { book.status = Status.READ ; book.save() }
println (Book.findAllByStatus (Status.READ)) //will print an empty list
println (Book.list().findAll (it.status == Status.READ)) // will print all books
No puedo entender por qué las dos últimas consultas pueden devolver resultados diferentes. Sin embargo, si realizo la siguiente modificación de book.save (flush: true). Ambas instrucciones impresas devolverán todos los libros.
Tenía la impresión de que esto no era necesario en una sola aplicación.
Como referencia que estoy usando
- DB: mysql
- maravilloso: 1.7.10
- Grails: 1.3.7
@ Hoang Long
Mi problema se demuestra a continuación, supongo que action1/action2 se llaman muchas veces, en ningún patrón particular
def action1 = {
Foo foo = Foo.get(params.id)
//... modify foo
foo.save() //if I flush here, it will be inefficient if action1 is called in sequence
}
def action2 = {
//if I flush here, it will be inefficient if action2 is called in sequence
List<Foo> foos = Foo.findAllByBar (params.bar)
//... do something with foos
}
Una solución sería tener una bandera que está establecido por action1 y usada por acción2 para eliminar si es necesario. Mi problema es que esta es una solución demasiado compleja, que no es escalable a medida que aumenta la complejidad de las llamadas a bases de datos.
boolean isFlushed = true
def action1 = {
Foo foo = Foo.get(params.id)
//... modify foo
foo.save()
isFlushed = false
}
def action2 = {
if (!isFlushed) {
//flush hibernate session here
}
List<Foo> foos = Foo.findAllByBar (params.bar)
//... do something with foos
}
Bastante. El ejemplo que di en mi pregunta fue un caso idealizado del problema.En realidad, cada llamada a save() ignora qué consultas se usarán más adelante ... No quiero usar siempre (flush: true) por miedo, pero ¿qué más puedo hacer? – Akusete
@Akusete: en su caso, ¿solo podría llamar al hibernate para finalizar la sesión al final? –
Este enlace puede ser útil: http://grails.org/FAQ#Q:%20How%20can%20I%20flush%20a%20Hibernate%20session%20multiple%20times%20within%20my%20controller%3F –