2009-12-30 12 views
5

मेरे पास वितरक डीबी आर्किटेक्चर है जहां एकाधिक SQL सर्वरों में डेटा संग्रहीत किया जाता है।प्रश्न एकल ado.net क्वेरी के साथ एकाधिक डेटाबेस

मैं एक प्रश्न चलाने के द्वारा चयन/अद्यतन/हटा कैसे कर सकता हूं। उदाहरण के लिए "कर्मचारियों से * चुनें" मेरे पास मौजूद सभी डेटाबेस से डेटा वापस करना चाहिए।

एकाधिक क्वेरी सर्वर पर चलने वाली एकल क्वेरी कैसे लिख सकती है और मेरे वेब सर्वर पर एक समेकित दृश्य प्राप्त कर सकती है।

नोट: के बाद से एसक्यूएल सर्वर की संख्या तो मैं (ऊपर या नीचे) पैमाने पर जुड़े हुए प्रश्नों के प्रबंधन के बाद से जुड़ा हुआ प्रश्नों की तुलना में कुछ और ही रहा हूँ विभिन्न समय पर बदल सकता है एक बड़ा दर्द

+0

लेनदेन द्वारा मैंने एक प्रश्न पूछकर चयन/अद्यतन/हटा दिया। उदाहरण के लिए "कर्मचारियों से चुनें *" को सभी तीन डेटाबेस से डेटा वापस करना चाहिए। – user72486

उत्तर

3

उपयोग TransactionScope है।

यदि आप दायरे के भीतर विभिन्न सर्वरों के लिए कनेक्शन खोलते हैं, तो लेनदेन एक वितरित लेनदेन के लिए सुलझाया जाएगा।

उदाहरण:

using (TransactionScope scope = new TransactionScope()) 
{ 
    conn1.Open(); //Open connection to db1 
    conn2.Open(); //Open connection to db2 

    // Don't forget to commit the transaction so it won't rollback 
    scope.Complete() 
} 
+0

बीटीडब्ल्यू, यह 'पूर्ण()' है, 'Commit() ' –

+0

सुधार के लिए धन्यवाद। फिक्स्ड। लेनदेन द्वारा – Oded

+0

मैंने एक प्रश्न पूछकर चयन/अद्यतन/हटा दिया। उदाहरण के लिए "कर्मचारियों से चुनें *" को सभी तीन डेटाबेस से डेटा वापस करना चाहिए। – user72486

6

विभिन्न डेटाबेस/कनेक्शन से बात करने के लिए आपको TransactionScope के माध्यम से एक वितरित लेन-देन की आवश्यकता होगी; सौभाग्य से, यह वास्तव में आसान db-लेन-देन से (यद्यपि आप System.Transactions.dll के लिए एक संदर्भ की जरूरत है) है: स्वाभाविक रूप से

using(TransactionScope tran = new TransactionScope()) { 
    // lots of code talking to different databases/connections 
    tran.Complete(); 
} 

साथ ही, TransactionScope घोंसला, और SqlConnection स्वचालित रूप से सूचीबद्ध है, यह वास्तव में आसान उपयोग करने के लिए कर रही है ।

+0

होगा यह ध्यान देने योग्य है कि लेनदेनस्कोप के साथ वितरित लेनदेन का उपयोग करने के लिए, आपको Windows 2000 या उच्चतर का उपयोग करने की आवश्यकता है और माइक्रोसॉफ्ट वितरित लेनदेन नियंत्रक (एमएसडीटीसी) सेवा चल रही है। –

+0

लेनदेन द्वारा मैंने एक प्रश्न पूछकर चयन/अद्यतन/हटा दिया है। उदाहरण के लिए "कर्मचारियों से चयन करें" को सभी तीन डेटाबेस से डेटा वापस करना चाहिए। – user72486

0

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

OpenLink Virtuoso एक विकल्प है। Virtuoso किसी भी ओडीबीसी-सुलभ (जेडीबीसी-सुलभ सहित, ओडीबीसी-टू-जेडीबीसी ब्रिज के माध्यम से) डेटा स्रोत से कनेक्शन खोलता है।

आपके डेटा उपभोग करने वाले एप्लिकेशन वर्डुसो से ओडीबीसी, जेडीबीसी, ओएलई-डीबी, या एडीओ.NET के जरिए कनेक्ट हो सकते हैं। सभी रिमोट लिंक्ड ऑब्जेक्ट्स (टेबल्स, व्यू, संग्रहीत प्रक्रियाएं इत्यादि) सभी डेटा एक्सेस मैकेनिज्म के माध्यम से उपलब्ध हैं।

जबकि आप यहां उल्लिखित अन्य तकनीकों का उपयोग करके समान परिणाम प्राप्त कर सकते हैं, तो अंतिम उपयोगकर्ता को बैक-एंड डेटा संरचनाओं के बारे में सभी को जानने और स्वयं को प्रश्नों को अनुकूलित करने की आवश्यकता होती है। Virtuoso के साथ, एक अंतर्निहित लागत-आधारित ऑप्टिमाइज़र दूरस्थ ऑब्जेक्ट्स में लिंक करते समय वर्चुअल स्कीमा के आधार पर कम से कम संभावित नेटवर्क ट्रैफ़िक के साथ सबसे तेज़ संभव परिणाम देने के लिए प्रश्नों को दोबारा लिख ​​देगा।

मुझे आशा है कि इससे मदद मिलती है!

टेड

ObDisclaimer: मैं OpenLink सॉफ्टवेयर के लिए काम करते हैं, लेकिन सीधे हमारे उत्पादों का उपयोग करने के लिए चुनने के किसी से लाभ नहीं मिलता।

+0

आपको अपने नियोक्ता द्वारा उत्पादित उत्पादों की सिफारिश करते समय अपनी संबद्धता का खुलासा करना चाहिए । –

0

आप एक ही क्वेरी के साथ जो भी कर रहे हैं, तब तक आप ऐसा नहीं कर सकते हैं जब तक कि आप किसी प्रकार की मध्यस्थता को शामिल नहीं करते हैं, जैसे कि SQL एक्सप्रेस इंस्टेंस, जो अन्य सर्वरों के साथ मध्यस्थता करेगा, शायद SQL CLR का उपयोग कर । लेकिन वह गन्दा है।

एसिंक अनुरोधों का एक समूह जारी करना बहुत आसान होगा, और फिर जब वे पहुंचें तो प्रतिक्रियाओं को एक डेटाटेबल (या समकक्ष) में मर्ज करें। मूल ADO.NET शैली async कॉल का उपयोग करके, सभी प्रश्न समानांतर में हो सकते हैं। एक डेटाटेबल में डेटा पढ़ने के दौरान आपको लॉक का उपयोग करने की ज़रूरत होगी।

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