2008-09-01 13 views
32

हमने अभी हमारे डीएएल & के लिए काम पर LINQ से SQL का उपयोग करना शुरू कर दिया है, हम वास्तव में आउट कैशिंग मॉडल के लिए मानक के साथ नहीं आए हैं। पहले हम आधार 'डीएएल' कक्षा का उपयोग कर रहे थे जिसने कैश मैनेजर प्रॉपर्टी को लागू किया था, जो हमारे सभी डीएएल वर्गों से विरासत में मिला था, लेकिन अब हमारे पास यह नहीं है। मैं सोच रहा हूं कि क्या कोई LINQ से SQL परिणामों को कैशिंग करने के लिए 'मानक' दृष्टिकोण के साथ आया है?लिंकक से एसक्यूएल में कैशिंग कैसे कार्यान्वित करते हैं?

यदि हम कोई फर्क पड़ता है तो हम एक वेब वातावरण (आईआईएस) में काम कर रहे हैं। मुझे पता है कि यह subjective प्रश्न होने पर भी समाप्त हो सकता है, लेकिन मुझे अभी भी लगता है कि जानकारी मूल्यवान होगी।

संपादित करें: स्पष्ट करने के लिए, मैं एक व्यक्ति के परिणाम को संचित करने के बारे में बात नहीं कर रहा हूँ, मैं के रूप में आप कैसे इतना है कि अपने सभी लिंक पद्धतियां ठीक उसी कैशिंग का उपयोग कैशिंग की स्थापना की है, एक वास्तुकला समाधान के अधिक के बाद कर रहा हूँ आर्किटेक्चर।

उत्तर

9

एक त्वरित उत्तर: अपनी संस्थाओं को लाने के लिए रिपोजिटरी पैटर्न (इवांस द्वारा डोमेन संचालित डिजाइन देखें) का उपयोग करें। प्रत्येक भंडार उन चीजों को कैश करेगा जो इसे रखेंगे, आदर्श रूप से रिपोजिटरी के प्रत्येक इंस्टेंस को सिंगलटन कैश तक पहुंचने के लिए (प्रत्येक थ्रेड/अनुरोध एक नया भंडार तुरंत चालू करेगा लेकिन केवल एक कैश हो सकता है)।

उपर्युक्त उत्तर केवल एक मशीन पर काम करता है। कई मशीनों पर इसका उपयोग करने में सक्षम होने के लिए, अपने कैशिंग समाधान के रूप में memcached का उपयोग करें। सौभाग्य!

+7

ध्यान दें कि इस दृष्टिकोण को वास्तव में LINQ या LINQ से SQL के साथ बहुत कुछ नहीं करना है। रिपोजिटरी-आधारित एपीआई आगे LINQ प्रश्नों के साथ संगत नहीं हैं। –

+1

रिपोजिटरी पैटर्न का उपयोग करते समय आपको ऑब्जेक्ट ट्रैकिंग बंद करना चाहिए। अन्यथा यह रिपोजिटरी के विवेकानुसार टूट जाएगा: 'भंडार। गेट (1)। संदर्भित योग्य। आईडी ... क्योंकि" संदर्भित योग्य "कैश की गई सूची के संदर्भ में देखने के लिए कठिन होगा। – bzlm

3

यह सही अपने नाक के नीचे है:

List<TableItem> myResult = (from t in db.Table select t).ToList(); 

अब, बस कैश myResult के रूप में आप अपने पुराने दाल के दिए गए डेटा कैश की गई है।

38

मेरा LINQ query result cache शायद वही है जो आप खोज रहे हैं।

var q = from c in context.Customers 
     where c.City == "London" 
     select new { c.Name, c.Phone }; 

var result = q.Take(10).FromCache(); 

पीट।

+4

यह कोड का एक शानदार टुकड़ा है, इस तरह की कुछ ढांचे में निर्माण की जरूरत है। – PeteT

+0

यह 2017 है और मैं इसी तरह के समाधान की तलाश में था और यह पाया कि यह https://github.com/zzzprojects/EntityFramework-Plus प्रोजेक्ट –

0

this article में 'ReferenceData' वर्ग में 'GetReferenceData' विधि देखें: http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq/

यह कैशिंग डेटा L2S का उपयोग कर लिया गया के लिए asp.net पृष्ठ कैश का उपयोग करता।

+0

यह लिंक काम नहीं करता है। –

1

मुझे this post मिला, जो LINQ ऑब्जेक्ट्स को कैशिंग करने के साधन के रूप में एक विस्तार विधि प्रदान करता है।

मैं weaks अब Linq2SQL के लिए एक अच्छा कैशिंग समाधान पता लगाने की कोशिश के लिए दीवार के खिलाफ मेरे सिर पीटने गया है, एक स्वीकार करना चाहिए कि मैं वास्तव में एक एक आकार सभी फिट बैठता है खोजने के लिए संघर्ष कर रहा हूँ ...

रिपोजिटरी पैटर्न लिंक की उपयोगीता को सीमित करता है, क्योंकि (IQueryable को पुन: कार्यान्वित किए बिना) कैशिंग को लिंक कथन के बाहर निष्पादित किया जाना चाहिए।

इसके अलावा, स्थगित लोडिंग और ऑब्जेक्ट ट्रैकिंग दोनों बड़ी संख्या में हैं यदि आप अपनी ऑब्जेक्ट्स को कैश करने जा रहे हैं, जो कुछ हद तक अद्यतन निष्पादित करता है।

कोई भी जो एक अत्यधिक समवर्ती वेब प्रोजेक्ट के भीतर जंगली में इस समस्या को हल करने में कामयाब रहा है, कृपया दुनिया में झुक जाओ और बचाओ! :)

1

मुझे लगता है कि यह शायद थोड़ा देर से जवाब है ... कम नहीं, आप LinqToCache प्रोजेक्ट को आजमा सकते हैं।यदि संभव हो तो यह एक मनमानी LINQ क्वेरी पर एक SqlDepdency को हुक करता है, और सर्वर पक्ष क्वेरी नोटिफिकेशन के माध्यम से सक्रिय कैश अमान्यता प्रदान करता है। नोटिफिकेशन के लिए प्रश्न मान्य प्रश्न होना चाहिए, Creating a Query for Notification देखें। अधिकांश लिंक-टू-एसक्यूएल प्रश्न इन प्रतिबंधों के अनुरूप हैं, जब तक कि तालिका दो भाग वाले नामों का उपयोग करके निर्दिष्ट की जाती है (dbo.Table, न केवल Table)।

+0

मैंने एक एकल तालिका (अनुरोध) के साथ एक मूल एल 2 एस मॉडल स्थापित किया है और मैं सीएनटीएक्स में आर से मूलभूत क्वेरी के लिए लिंककोकैच का उपयोग करने की कोशिश कर रहा हूं। अनुरोधों का चयन आर '। हालांकि, यह अपवाद के साथ विफल रहता रहता है 'विकल्प मान प्रदान किए बिना SqlDependency का उपयोग करते समय, SqlDependency.Start() को SqlDependency इंस्टेंस में जोड़े गए कमांड को निष्पादित करने से पहले बुलाया जाना चाहिए।' कोई विचार? – James

+1

@ जेम्स: कॉल 'SqlDependency.Start() '? –

+0

मेरा बुरा, मैंने बेवकूफ ढंग से सोचा कि 'AsCached'' SqlDependency.Start() 'आंतरिक रूप से ट्रिगर कर रहा था ... फिर एहसास हुआ कि इसका कोई मतलब नहीं होगा! यह अब काम कर रहा है, धन्यवाद। अच्छा काम बीटीडब्ल्यू, भविष्य में ई 2 एफ के साथ काम करने के लिए कोई उम्मीद है? – James