2010-11-12 13 views
6

मेरे पास एक ऐसी साइट है जहां उपयोगकर्ता पहले अपना खोज मानदंड दर्ज करेंगे। खोज 2 स्रोतों से डेटा को जोड़ती है, जिनमें से एक डेटाबेस नहीं है। खोज परिणाम आम तौर पर बड़े होने के लिए पर्याप्त होते हैं।grails में कैशिंग डेटा

प्रारंभिक क्वेरी महंगा होने के बाद से, यदि खोज मानदंड बाद के पृष्ठ दृश्यों में परिवर्तित नहीं होता है तो मैं खोज परिणामों को कैश करना चाहता हूं।

मेरे वर्तमान विधि लगता है:

def search(criteriaMap, offset, pagesize) 

ग्रूवी/grails में खोज परिणामों को संचित करने का सबसे अच्छा तरीका क्या है? मैं खोज परिणामों की अवधि कैसे समाप्त करूं?

नोट, मुझे लगता है कि एक springcache प्लगइन है लेकिन मुझे यकीन नहीं है कि यह पेज किए गए परिणामों के लिए काम करेगा या नहीं। मुझे यह भी पता है कि grails ehcache के साथ पैक किया गया है, लेकिन मैंने एपीआई को सीधे नहीं देखा है, मैंने केवल इसे देखा है कि यह गोर्म के साथ दूसरे स्तर के कैशिंग के लिए उपयोग किया जाता है।

अद्यतन: मैंने इसे हल करने के लिए @ mfloryan के समाधान का हिस्सा लिया।

@Cacheable("searchCache") 
def searchResults(uid, trimmedParams) 
def trimParams(params) 

(एक कैश किया गया है और अन्य नहीं है।)

searchController में मेरे कोड:

def trimmedParams = searchService.trimParams(params) 
def results = searchService.searchResults(trimmedParams) 

//Page results 
results = HelperService.pageResults(results, params.offset, params.max) 

[results: results, searchParams : trimmedParams] 

मैं searchService में दो तरीकों बनाया

एक परिणाम के रूप में, मैंने खोज सेवा को उन पैरामीटर की एक छंटनी सूची के साथ बुलाया जो संलग्न नहीं है ude पेजिंग पैराम। कैश किए गए खोज परिणामों को वापस किया जा सकता है।

खोज नियंत्रक पेजिंग का ख्याल रखता है।

नोट: मैंने हाइबरनेट परिणामों को कैश नहीं किया क्योंकि मैं कैश में डेटा को दोगुना कर दूंगा। मैंने केवल searchService.searchResults (जो एक आरईएसटी एपीआई और मेरा स्थानीय डेटाबेस हिट करता है) से संयुक्त परिणाम कैश किया है

उत्तर

5

सबसे पहले, यदि आप क्वेरी को कैश करना चाहते हैं, तो शायद हाइबरनेट क्वेरी कैश का उपयोग करना एक अच्छी शुरुआत है (सेट cache:truemappings और executeQuery को cache: true)

पारित SpringCache plug-in का उपयोग करके आप नियंत्रक से पूरे प्रतिक्रिया कैश करने के लिए अनुमति देगा। आपको बस इतना करना होगा कि नियंत्रक को उस तरह सजाने के लिए: @Cacheable("searchMethodCache") या केवल अलग-अलग तरीकों को सजाने के लिए जिन्हें आप कैश के परिणाम चाहते हैं। कैश क्वेरी स्ट्रिंग द्वारा प्रतिक्रिया सहेज लेगा ताकि इसे पेजिंग के साथ अच्छी तरह से काम करना चाहिए। @CacheFlush एनोटेशन सेट करने की अनुमति देता है जब कैश को साफ़ किया जाना चाहिए। अद्यतन - -

एह कैश अपने आप में grails-app/conf/spring/resources.groovy

कॉन्फ़िगर किया गया है

आप टिप्पणी मुझे लगता है करने के लिए अपने एक अलग समाधान की सोच रहे होंगे कि शुरू के बाद। तो एक प्रश्न है जो परिणामों की एक सूची देता है और उस सूची को तब पेजेड और प्रदर्शित किया जाता है।मानक Grails दृष्टिकोण के साथ Hibernate प्रत्येक पृष्ठ के लिए एक क्वेरी उत्पन्न करेगा (पूर्ण सूची से एक सबसेट लौट रहा है इस प्रकार प्रत्येक पृष्ठ के लिए संभावित रूप से महंगा महंगी क्वेरी चला रहा है)। संभवतः आप क्वेरी को एक बार चलाने के लिए चाहते हैं - पूरा परिणाम सेट वापस करने के लिए जो कैश हो जाता है और उसके बाद से अलग-अलग पृष्ठों की सेवा करता है। यदि यह मामला है, जहां तक ​​मुझे पता है, तो आपको परिणामों को मैन्युअल रूप से हाइबरनेट कैश से पृष्ठ पर या पृष्ठ को कहीं और कैशिंग करना होगा (सत्र संदर्भ?)

+0

पेजिनेशन विजेट इस के साथ कैसे सहभागिता करेगा? क्या मैं समय या फीफो ऑर्डर के आधार पर कैश फ्लश कर सकता हूं? – Tihom

+0

किसी भिन्न पृष्ठ पर जाकर क्वेरी स्ट्रिंग में परिवर्तन होता है, इसलिए अलग-अलग प्रतिक्रिया कैश की जाती है और फिर सेवा की जाती है। कैश स्वचालित रूप से समाप्त हो जाता है इसलिए समय के आधार पर स्पष्ट रूप से फ्लश करने की आवश्यकता नहीं होती है। बस इसे sprigcache/caches/[cacheName]/timeToLive = ... – mfloryan

+0

के तहत Config.groovy में सेट करें, मैं अलग-अलग पृष्ठों के लिए आवश्यकता से बचना चाहता हूं। मैं उसको कैसे करू? – Tihom