मैं जो एक GORM cacheing समस्याक्या मुझे कभी भी गोरम में कॉल को बचाने के लिए स्पष्ट रूप से फ्लश करने की आवश्यकता है?
//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 (फ्लश: सत्य) का निम्नलिखित संशोधन करता हूं। दोनों प्रिंटलाइन विवरण सभी पुस्तकों को वापस कर देंगे।
मैं इस धारणा के तहत था कि यह एक ही आवेदन के भीतर आवश्यक नहीं था।
संदर्भ के लिए उपयोग किया जा रहा
- डीबी: mysql
- ग्रूवी: 1.7.10
- Grails: 1.3.7
@ Hoàng Long
मेरी समस्या नीचे प्रदर्शित की गई है, मान लीजिए कि एक्शन 1/एक्शन 2 दोनों को कई बार बुलाया जाता है, कोई विशेष पैटर्न में
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 द्वारा निर्धारित और यदि आवश्यक हो फ्लश करने के लिए एक्शन 2 द्वारा किया जाता है के लिए किया जाएगा। मेरी समस्या यह है कि यह एक अत्यधिक जटिल समाधान है, जो स्केलेबल नहीं है क्योंकि डीबी कॉल की जटिलता बढ़ जाती है।
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
}
पर्याप्त मेला। मेरे प्रश्न में मैंने जो उदाहरण दिया वह समस्या का एक आदर्श मामला था।हकीकत में प्रत्येक कॉल को बचाने के लिए() बाद में कौन से प्रश्नों का उपयोग किया जाएगा, इस बारे में अनजान है ... मैं हमेशा डर से बाहर (फ्लश: सच) का उपयोग नहीं करना चाहता, लेकिन मैं और क्या कर सकता हूं? – Akusete
@ अकुसेते: आपके मामले में, क्या आप अंत में केवल फ्लश सत्र में हाइबरनेट को कॉल कर सकते हैं? –
यह लिंक उपयोगी हो सकता है: http://grails.org/FAQ#Q:%20How%20can%20I%20flush%20a%20Hibernate%20session%20multiple%20times%20within%20my%20controller%3F –