Tôi gặp một trường hợp lạ dường như cho biết sự cố bộ nhớ đệm 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
Tôi không thể hiểu tại sao hai truy vấn cuối cùng có thể trả về kết quả khác nhau.
Tuy nhiên, nếu Tôi thực hiện sửa đổi sau đây đối với book.save (flush: true) . Cả hai câu lệnh println sẽ trả về tất cả các sách.
Tôi có ấn tượng rằng điều này không cần thiết trong một ứng dụng.
Để tham khảo, tôi đang sử dụng
@ Hoàng Long
Vấn đề của tôi được minh họa bên dưới, giả sử action1 / action2 là cả hai đều được gọi nhiều lần, không theo mẫu cụ thể nào
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
}
Một giải pháp là có một cờ được đặt bởi action1 và được action2 sử dụng để tuôn ra nếu cần. Vấn đề của tôi là đây là một giải pháp quá phức tạp, không có thể mở rộng khi độ phức tạp của các lệnh gọi DB tăng lên.
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
}