2015-11-12 5 views
10

के लिए थर्ड-लेवल कैश हमारी परियोजना एंटिटी फ्रेमवर्क का उपयोग करती है और बिना किसी कैश प्रदाता के 2 प्रकार के कैश (इन-मेमोरी, रेडिस) होती है। lack of second-level cache support in EF के कारण हमने इसे स्वयं लागू किया। तो हमारा इन-मेमोरी कैश कुंजी मूल्य जोड़ी का सरल सेट है जहां कुंजी कैश का आईडी है और मूल्य कैश्ड ऑब्जेक्ट है। हमने रेडिस का उपयोग करने के लिए इसी तरह के कैशिंग को भी लागू किया। क्वेरी के लिए हम इन-मेमोरी कैश सूची देखते हैं और यदि यह थर्म नहीं है तो हम रेडिस को देखते हैं और यदि ऐसा नहीं होता है तो हम डेटाबेस के खिलाफ क्वेरी करते हैं।NHibernate

क्योंकि इकाई ढांचे इकाइयों के संदर्भ में संदर्भ है क्योंकि हम कैशिंग में DbContext की इकाई का उपयोग नहीं कर सकते हैं और हमें इसे मानचित्र करने की आवश्यकता है। तो हमें बहुत सारे डीटीओ बनाने की जरूरत है।

मुझे पता है कि कैश cross-cutting concern है इसलिए मैं क्लीनर समाधान की तलाश करता हूं। इस कारण से, पहले मैं इन-मेमोरी (सरल सूची का उपयोग करने के बजाय) के लिए Memcached का उपयोग करने का निर्णय लेता हूं। दूसरे और सबसे महत्वपूर्ण रूप में मैं अपने द्वितीय-कैश समर्थन के लिए ईएफ से एनएचबीरनेट में माइग्रेट कर सकता हूं। मुझे पता है कि first level cache is occupied by session object। तो मैं दूसरे स्तर के कैश के लिए मेमकैच का उपयोग करना चाहता हूं। लेकिन क्या रेडिस के लिए कोई तीसरा स्तर कैश है?

+0

डीटीओ के बारे में क्या आपको प्रॉक्सी (डीबीकॉन्टेक्स्ट के) के साथ इकाइयों का उपयोग करने में समस्याएं हैं? आम तौर पर समस्या तब उत्पन्न होती है जब आप संबंधित गुणों तक पहुंचने का प्रयास करते हैं जो आलसी लोडर के कारण लोड नहीं होते हैं, जो एक डिस्पोजेड संदर्भ तक नहीं पहुंच सकते हैं लेकिन आपके पास अलग-अलग इकाइयों के साथ एक ही समस्या है (दोनों मामलों में आपको शामिल करने की आवश्यकता है)। डीटीओ के बारे में फिर से मैं हमेशा एक उथले क्लोन को लागू करने के लिए क्लोन लागू करता हूं (लेकिन यह इकाई पर निर्भर करता है) और अक्सर (हमेशा) फ़ील्ड मान प्रतिलिपि (सदस्यवृत्ति के समान कस्टम फ़ंक्शन का उपयोग करके, लेकिन सदस्य की तरफ से क्लोन नहीं करता है अन्यथा आपके पास फिर से पूरी प्रॉक्सी होती है)। – bubi

+0

@bubi मैं दृढ़ता ढांचे के लिए अपने डोमेन मॉडल समझौता नहीं करना चाहता। डीटीओ बनाना कुछ मोमेंटो पैटर्न की तरह है। दूसरा, मैं एक अच्छा कैश प्रदाता चाहता हूं कि इकाई ढांचा नहीं है। –

+0

आप ऊपर दिए गए दृष्टिकोण का उपयोग कर मॉडल से समझौता नहीं करते हैं। मुझे लगता है कि आपने किया लेकिन यदि आपने नहीं किया तो आप ईएफ के लिए दूसरे स्तर के कैश कार्यान्वयन को देख सकते थे। हाइबरनेट के बारे में मैं आपको यह सुझाव देने का सुझाव देता हूं कि आपके उद्देश्य के लिए ठीक काम करता है या नहीं। मैं कह सकता हूं कि अब (नई परियोजनाओं के लिए) मैं ईएफ का उपयोग कर रहा हूं जबकि पुरानी परियोजनाएं अभी भी हाइबरनेट में हैं। हाइबरनेट के बारे में समस्या यह है कि अक्सर आपको बहुत जल्दी प्रश्नों को पूरा करने की आवश्यकता होती है। यदि आप स्मृति में काम करना हमेशा सोचते हैं/हमेशा यह ठीक काम करता है लेकिन यदि आपको डीबी पर काम करने की ज़रूरत है तो आपको कभी-कभी एचक्यूएल या एसक्यूएल लिखना होगा (या क्वेरी में शुरुआती टूलीस्ट() डालना होगा)। – bubi

उत्तर

2

बहुत सारे डीटीओ बनाये बिना दूसरे स्तर के कैश को लागू करने का एक तरीका है डीटीओ को संग्रहीत करने के बजाय संपत्ति मूल्य मूल्य सूची में एक महत्वपूर्ण मूल्य सूची में उपयोग करना। मेरी समझ के अनुसार NHibernate में कोई तीसरा स्तर कैश नहीं है। ऐसा करने का एक तरीका एक कस्टम कैश प्रदाता को लागू करना है जो पहली बार रेडिस में देख सकता है और यदि इसे नहीं मिल पाता है तो मेमकैड से मूल्य प्राप्त करें।