У меня странная ситуация, которая указывает на проблему с кэшированием в GORM
//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
Я не могу понять, почему два последних запроса могут возвращать разные результаты.
Однако, если я сделаю следующеемодификация book.save (flush: true) .Оба оператора println вернут все книги.
У меня сложилось впечатление, что в одном приложении это не нужно.
Для справки я использую
- DB: mysql
- Groovy: 1.7.10
- Grails: 1.3.7
@ Hoàng Long
Моя проблема показана ниже, предположим, что action1 / action2 оба вызываются много-много раз, без какого-либо конкретного паттерна
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
}
Одним из решений было бы иметь флаг, который устанавливается action1 и используется action2 дляпри необходимости промойте.Моя проблема в том, что это слишком сложное решение, которое не масштабируется, так как увеличивается сложность вызовов БД.
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
}