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
最後の 2 つのクエリが異なる結果を返す理由がわかりません。
ただし、次のようにbook.save(flush:true)を変更すると。どちらの println ステートメントもすべての本を返します。
これは単一のアプリケーション内では必要ないという印象を受けました。
参考までに私が使っている
- データベース: mysql
- グルービー: 1.7.10
- グレイル: 1.3.7
@ホアンロング
私の問題を以下に示します。特定のパターンではなく、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
}
1 つの解決策は、アクション 1 によって設定され、必要に応じてフラッシュするためにアクション 2 によって使用されるフラグを持つことです。私の問題は、これが非常に複雑なソリューションであり、DB 呼び出しの複雑さが増すにつれて拡張できないことです。
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
}