2011-09-15 12 views
9

मैं वर्तमान में अपना खुद का छोटा ओआरएम रोल कर रहा हूं, और एक ही इकाई को डेटाबेस से एक से अधिक लोड करने से रोकने के लिए खुद को एक कैनोलिकलाइजिंग मैपिंग बनाने के कार्य का सामना करना पड़ता हूं।जावा में कैनोलिकलाइजिंग मैपिंग को कैसे कार्यान्वित करें?

मेरा वर्तमान दृष्टिकोण HashMap<Object, WeakReference<Object>> का उपयोग करना है। कुंजी मैप किए गए डेटाबेस-इकाई की प्राथमिक कुंजी है (ArrayList<Object> यदि यह एक समग्र कुंजी है), और मान WeakReference<Object> हैं।

मेरी मुख्य समस्या यह है कि मानचित्र को कैसे साफ किया जाए? जब किसी ऑब्जेक्ट का उपयोग नहीं किया जाता है, तो मानचित्र में कमजोर संदर्भ null पर जाएगा, और मैं इसे केवल अगले लुकअप पर खोजूंगा (या कभी नहीं, अगर मैं ऑब्जेक्ट को फिर से नहीं देखता)। जब मैं साफ़ हो जाता हूं तो मैं ReferenceQueue के साथ कमजोर संदर्भों को पंजीकृत कर सकता हूं, और उसके बाद हर बार जब मैं कुछ देखता हूं तो उस कतार की जांच कर सकता हूं। स्पष्ट संदर्भ मुझे कोई संकेत नहीं देगा कि किस ऑब्जेक्ट को मंजूरी दे दी गई थी, इसलिए मुझे लगता है कि मुझे नक्शा में कुंजी स्टोर करने के लिए WeakReference उप-वर्ग करना होगा, इसलिए संदर्भ को साफ़ करने के बाद मैं इसे हटा सकता हूं।

क्या यह तरीका है, या इसे लागू करने का कोई आसान तरीका है?

उत्तर

13

मैं रावा में, या CacheBuilder का उपयोग करने की सलाह दूंगा।

वे स्वचालित * समय- और आकार-आधारित निष्कासन, साथ ही साथ कमजोर कुंजियों या मानों का समर्थन करने की अनुमति देते हैं। (आगामी CacheBuilder वादे विशेष रूप से उपयोग के मामले में इस तरह के अनुरूप होना करने के लिए।)

तो आप अपने मानचित्र आरंभ कर सकते हैं:

ConcurrentMap<Key, Object> cache = new MapMaker() 
     .weakValues() 
     .makeMap(); 

और तत्काल लाभ होगा कि जब एक मूल्य कचरा एकत्र किया जाता है, पूरी प्रविष्टि हटा दी जाएगी।

ConcurrentMap<Key, Object> cache = new MapMaker() 
     .weakValues() 
     .makeComputingMap(loadFunction); 

जहां loadFunction एक Function<Key, Object> कि डेटाबेस से एक वस्तु को लोड करता है: इसके अलावा, आप एक कंप्यूटिंग मानचित्र का उपयोग कर सकते हैं। इसका लाभ यह है कि नक्शा एक विशेष वस्तु के लिए समवर्ती अनुरोधों को संभालेगा, यह सुनिश्चित करने के लिए कि क्वेरी केवल एक बार बुलाया जाए। इसके अतिरिक्त, अनुरोध कोड को केवल get() पर कॉल करने की आवश्यकता है और कैश या डेटाबेस से ऑब्जेक्ट को हमेशा वापस उम्मीद कर सकते हैं।

ये उदाहरण MapMaker का उपयोग कर रहे हैं - मुझे अभी तक CacheBuilder के साथ खिलौना का आनंद नहीं मिला है।

अधिक उदाहरण के लिए मेरे प्रश्न my ideal cache using guava देखें। उस पोस्ट में चर्चा की गई है कि कैननिकलाइजेशन के साथ समय-आधारित बेदखल कैसे जोड़ना है।

+2

मैं इस पुस्तकालय को जोड़ने के लिए पहली बार संकोच कर रहा था, लेकिन अब मैंने किया, मुझे आश्चर्य है कि मैंने पहले ऐसा क्यों नहीं किया था। इस महान जवाब के लिए धन्यवाद! –

संबंधित मुद्दे