У меня странная ситуация, которая, как представляется, указывает на проблему кеширования GORM
//begin with all book.status 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
}