2012-11-27 20 views
5

में एनोम का उपयोग करते समय कैश तंत्र को कैसे जोड़ना है, मुझे लगता है कि एर्म एक ओआरएम फ्रेमवर्क नहीं है, यह सीधे SQL द्वारा डेटा पूछताछ कर रहा है। अधिकांश एप्लिकेशन/वेबसाइट के लिए, हमें हर बार डेटाबेस से पूछताछ नहीं करनी चाहिए, हमें डेटा या तो एसक्यूएल या आइटम आईडी द्वारा कैश करने की आवश्यकता है। मुझे आश्चर्य है कि क्या playframework ने किसी भी प्रकार की कैशिंग तंत्र प्रदान किया है? यदि इसे जोड़ने का तरीका नहीं है?Playframework

धन्यवाद।

उत्तर

10

आप अपने डेटाबेस क्वेरी करने से पहले अपने नियंत्रक में खेलने के संचय का उपयोग कर सकते हैं।

val user: User = Cache.getOrElse[User](key = "user" + userId, expiration = 10) { 
    User.findById(userId) 
} 

इस कोड में डेटाबेस क्वेरी करने के लिए प्रयास करने से पहले, हम यदि उपयोगकर्ता ने पहले लोड नहीं की गई कैश में एक देखने की जाँच करने के बनाने के लिए, यहाँ एक सरल उदाहरण Play cache documentation और Scala API से ली गई है। यदि कैश में नहीं मिला है, तो हम उसे कैश में 10 सेकंड में समाप्ति के साथ स्टोर करते हैं।

+0

+1, लेकिन 10 सेकंड कैश में भी मदद करेगा? मैं 2 मिनट से 24 घंटे व्यक्तिगत रूप से जा रहा हूं। यह सुनिश्चित नहीं है कि बहुत कम कैश समाप्ति समय निर्धारित करने में कम रिटर्न का कोई बिंदु है या नहीं। – virtualeyes

+0

निश्चित रूप से, यह केवल उदाहरण के लिए –

0

मान लें कि आप Play2 ढांचे का उपयोग कर रहे हैं, यह वास्तव में एक कैश तंत्र प्रदान करता है। यह यहाँ अच्छा प्रलेखन है:

http://www.playframework.org/documentation/2.0/JavaCache (इसके बुलाया javacache, लेकिन यह स्काला से काम करता है)

+0

आपके उत्तर के लिए धन्यवाद। मैं इसे प्ले दस्तावेज़ से देखता हूं, यह ehcache का उपयोग कर रहा है, लेकिन यह एनोम के साथ एकीकृत नहीं है, क्वेरी परिणामों को कैश करने के लिए इसका उपयोग करना आसान नहीं है, मुझे आश्चर्य है कि Playframework ने ऐसा करने का तरीका प्रदान किया है या नहीं। अगर किसी ने कैश लागू किया है, तो यह – Simon

6

आप आसानी से एनोम विधियों के उत्तर को कैश कर सकते हैं।

def findById(id: Long): Option[User] = { 
    Cache.getOrElse(userCacheKey + id, 60*60) { 
     DB.withConnection { 
     implicit connection => 
      SQL("select * from publisher where id = {id}").on('id -> id).as(User.simple.singleOpt) 
     } 
    } 
} 

कोड का चयन करें और दुकानों getOrElse के माध्यम से कैश में जवाब है: उदाहरण के लिए, वास्तविक विधि है कि मैं का उपयोग करें। यदि मान कैश में है, तो यह सत्यापित हो जाएगा और कोई क्वेरी निष्पादित नहीं की जाएगी।

केवल मुद्दा (इसलिए यह पुराना डेटा नहीं रखता) आप कैश से अपडेट करना होगा आप इकाई उपयोगकर्ता को अद्यतन जब है:

// Assumes a user: User object available with the updated user 
Cache.set(userCacheKey + id, cached.copy(name = user.name, avatar = user.avatar, bio = user.bio, url = user.url, location = user.location), 60*60) 
+0

एक ही समय में एक ही जवाब था :-) –

+0

हाहा हाँ, थोड़ा अलग है क्योंकि मैं इसे कॉलर में एनोम में कैश करता हूं, लेकिन अनिवार्य रूप से वही :) –

+0

धन्यवाद दोस्तों, यह दृष्टिकोण काम किया, लेकिन बहुत अधिक कोडिंग की जरूरत है और यह व्यापार कोड में एम्बेड करता है। मुझे उम्मीद है कि कैश तंत्र एक सामान्य ढांचा होना चाहिए ताकि अंतिम उपयोगकर्ता केवल क्वेरी तर्क की परवाह करे, लेकिन कैश और कैश अमान्यता न हो। अगर यह मेरे लिए यह कर सकता है तो यह सही होगा :) – Simon