2011-10-03 5 views
6

क्या वेब सर्वर को सूचित करने का कोई तरीका है (मेरे मामले में, सी # में एक एमवीसी 2 वेबएप होस्ट करने वाला एक वेब सर्वर) तथ्य यह है कि डेटाबेस में कोई बदलाव आया था? इसका उद्देश्य डेटाबेस के साथ सिंक्रनाइज़ किए गए वेब सर्वर कैश को रखना है।एसक्यूएल सर्वर तालिका परिवर्तन के वेब सर्वर को सूचित करता है

एएसपी.नेट में मतदान संरचनाएं हैं जो इसकी अनुमति देती हैं, लेकिन मैं एक पुश सिस्टम पसंद करता हूं। मैं इस धारणा के तहत भी हूं कि डेटाबेस को वेब सर्वर के अलावा अन्य तत्वों द्वारा छेड़छाड़ की जा सकती है।

SQL सर्वर/एएसपी एमवीसी का मेरा सीमित ज्ञान यह कहता है कि एक तरीका एक टेबल ट्रिगर बनाने के माध्यम से है जो काफी यूआरएल को हिट करता है जो एक अद्यतन को मजबूर करेगा।

उत्तर

7

SqlDependency, जाने के लिए करता है, तो परिवर्तन की दर मध्यम है तरीका है। परिवर्तन की उच्च दर के लिए आप परिवर्तनों के लिए बेहतर मतदान करते हैं। यह समझने के लिए कि SQLDependency कैसे काम करता है, The Mysterious Notification पढ़ें। एएसपी में पहले से ही एसक्लड निर्भरता, SqlCacheDependency के लिए अंतर्निहित समर्थन है। LinqToCache भी है जो संभवतः किसी भी मनमानी LINQ क्वेरी के लिए एसक्लड निर्भरता क्षमता को जोड़ता है।

ट्रिगर बिल्कुल एक बड़ा नंबर नहीं है। आपके पास जवाब देने के लिए कुछ यूआरएल पर डेटाबेस लेन-देन की प्रतीक्षा नहीं हो सकती है, आपका प्रदर्शन मूल रूप से कुछ भी नहीं गिर जाएगा। उपलब्धता के मुद्दे का उल्लेख नहीं करना है (यदि यूआरएल किसी भी कारण से प्रतिक्रिया नहीं देता है तो अद्यतन विफल हो जाएंगे)।

+0

SqlCacheDependency (SqlCommand) की तरह लगता है मैं क्योंकि यह सुनिश्चित करने के प्रयास करता है के लिए क्या देख रहा हूँ है वितरण। लेकिन आपने मुझे सुझाव से खो दिया कि क्वेरी अधिसूचना विधि को मतदान पसंद किया जाएगा। परीक्षण के मुकाबले एक बार अधिक कुशल मतदान की लागत यह देखने के लिए आवश्यक है कि अधिसूचना के लिए अनुरोधित क्वेरी कुछ डालने/अपडेट/हटाए जाने से प्रभावित हुई है या नहीं? –

+1

अधिसूचना देने की लागत महत्वपूर्ण है। यदि आप परिवर्तन की उच्च दर से तत्काल अमान्य होने के लिए एक अधिसूचना सेट अप करते हैं, तो आप सीधे मूल्य की जांच करना बेहतर होगा। क्या एक अच्छी रेखा है जिसमें मतदान के लिए बेहतर बिंदु तालिका से तालिका तक आवेदन से आवेदन में भिन्न होता है। भारी लोड के तहत आपको एक बनाम दूसरे के प्रभाव को मापना और देखना होगा। –

1

आपका "सीमित SQL सर्वर का सीमित ज्ञान" पर्याप्त है। आपको एक बार इन्सर्ट, अद्यतन, ट्रिगर हटा देना चाहिए जो आपको चाहिए जो करने की ज़रूरत है।

एक और बात है कि यह एक बुरा विचार है

उचित तरीके से हल करने के लिए मुद्दों इस तरह का संदेश कतार जैसे किसी तरह का उपयोग करने के लिए है, लेकिन आप शायद उस के बारे में पता कर रहे हैं ..। MSMQ।

2

एकमात्र तरीका जिसे मैं सोच सकता हूं वह एक सीएलआर उपयोगकर्ता परिभाषित फ़ंक्शन (यूडीएफ) लिखना है और ब्याज की तालिका (नों) पर ट्रिगर्स डालने/अपडेट/निकालने के माध्यम से इसे आमंत्रित करना है।

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

4

मुझे अपने साथ अनुभव नहीं है, लेकिन System.Data.SqlClient.SqlDependency कक्षा आपको जिस तरह की जरूरत है, वह दिखती है।

MSDN के अनुसार:

SqlDependency कैशिंग परिदृश्यों, जहाँ आपके ASP.NET आवेदन या मध्यम स्तरीय सेवा कुछ जानकारी स्मृति में कैश रखने की जरूरत के लिए आदर्श है। SqlDependency आपको नोटिफिकेशन प्राप्त करने की अनुमति देता है जब डेटाबेस में मूल डेटा बदलता है ताकि कैश रीफ्रेश हो।

0

तालिका सामग्री बदल/अपडेट होने पर डेटाबेस से अधिसूचना प्राप्त करने के लिए, आप TableDependency का उपयोग कर सकते हैं।

.NET SqlDependency के साथ अंतर यह है कि TableDependency डेटाबेस तालिका मानों को परिवर्तित/हटाए/डालने वाले ईवेंट को बढ़ाएं।

SqlDependency का उपयोग करके आपको किसी भी समय ताजा डेटा प्राप्त करने के लिए एक चयन निष्पादित करना होगा SqlDependency डेटाबेस कोड पर कुछ बदल गया है जो आपके कोड को सूचित करें।

TableDependency साथ

आप बच सकते हैं कि क्योंकि घटना आपको प्राप्त सभी हटाए गए/डाला/संशोधित मान हैं:

string conString = "data source=.;initial catalog=myDB;integrated security=True"; 

using(var tableDependency = new SqlTableDependency<Customers>(conString)) 
{ 
    tableDependency.OnChanged += TableDependency_Changed; 
    tableDependency.Start(); 

    Console.WriteLine("Waiting for receiving notifications..."); 
    Console.WriteLine("Press a key to stop"); 
    Console.ReadKey(); 
} 
... 
... 
void TableDependency_Changed(object sender, RecordChangedEventArgs<Customers> e) 
{ 
    if (e.ChangeType != ChangeType.None) 
    { 
     var changedEntity = e.Entity; 
     Console.WriteLine("DML operation: " + e.ChangeType); 
     Console.WriteLine("ID: " + changedEntity.Id); 
     Console.WriteLine("Name: " + changedEntity.Name); 
     Console.WriteLine("Surname: " + changedEntity.Surname); 
    } 
} 
संबंधित मुद्दे