2009-12-01 13 views
7

मुझे इस विषय पर बहुत कम जानकारी मिली है, उम्मीद है कि कोई मुझे कुछ जानकारी और संभावित नमूना कोड पर निर्देशित कर सकता है।सी # अनुप्रयोग में धागे के बीच एक डीबी कनेक्शन साझा करना?

+0

मुझे लगता है कि यह डेटाबेस से डेटाबेस विक्रेता से भी अलग है ... mysql, ms sql, sqlite ... – tuinstoel

उत्तर

6

मैं कहूंगा कि कनेक्शन ऑब्जेक्ट को स्वयं साझा न करें, बस एक नया कनेक्शन बनाएं और ADO.net को कनेक्शन पूलिंग संभाल दें।

+0

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

10

आम तौर पर कनेक्शन थ्रेड सुरक्षित नहीं होते हैं (SQL कनेक्शन, MySQL कनेक्शन और OracleConnection विशेष रूप से उल्लेख करते हैं कि वे थ्रेड सुरक्षित नहीं हैं)।

धागे के बीच कनेक्शन साझा न करें।

0

जंगली में कोई नमूना कोड नहीं है क्योंकि (लगभग) कोई भी ऐसा नहीं करता क्योंकि यह इतना, बहुत बुरा विचार है।

3

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

public class SyncedDbCommand : DbCommand 
{ 
    private DbCommand _cmd; 
    private object _sync; 

    public SyncedDbCommand(DbCommand cmd, object sync) 
    { 
     _cmd = cmd; 
     _sync = sync; 
    } 

    // omitted basic proxy method overrides 

    protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) 
    { 
     Monitor.Enter(_sync); 
     return _cmd.ExecuteReader(); 
    } 

    public override int ExecuteNonQuery() 
    { 
     Monitor.Enter(_sync); 
     return _cmd.ExecuteNonQuery(); 
    } 

    public override object ExecuteScalar() 
    { 
     Monitor.Enter(_sync); 
     return _cmd.ExecuteScalar(); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      Monitor.Exit(_sync); 
     } 
     base.Dispose(disposing); 
    } 
} 

नमूना का उपयोग करने के लिए आपको एक वास्तविक DbCommandके साथ-साथ किसी वस्तु उदाहरण है कि एक कनेक्शन के सभी प्रयोगों में साझा किया जाने के साथ यह दृष्टांत किया है। सबसे सरल उपयोग में, आप लॉक ऑब्जेक्ट के रूप में कनेक्शन ऑब्जेक्ट को भी पास कर सकते हैं। तात्कालिकता using कथन में होनी चाहिए। यह आपको यह जानने से नहीं रोकता कि आपकी उपयोग आवश्यकताओं क्या हैं और Monitor कक्षा और लॉकिंग कार्य कैसे करें।

एक तरफ या दूसरा, आप धागे के कनेक्शन के उपयोग को सिंक्रनाइज़ करना चाहते हैं, और उपर्युक्त ऐसा करने का एक दृष्टिकोण है।

+1

बिल्कुल ऐसा नहीं करते हैं, ऐसा करने का कोई अच्छा कारण नहीं है और आप अपने आवेदन के प्रदर्शन को प्रभावित करेंगे। उपर्युक्त उत्तर राज्यों जैसे कनेक्शन पूलिंग का उपयोग करें। –

+1

"कोई अच्छा कारण नहीं है"? अपने कोड की वास्तुकला को जानने के बिना आप इसका दावा कैसे कर सकते हैं? कनेक्शन साझा करने के लिए, यह एमएसडीटीसी को बढ़ावा दिए बिना लेनदेन को सक्षम करने के लिए एक प्रसिद्ध तरीका है। यह एक बड़ा प्रदर्शन लाभ है। फिर भी, खरोंच से शुरू, निश्चित रूप से मैं अपने जवाब में वर्णित दृष्टिकोण की सलाह नहीं दूंगा। लेकिन * पूछताछ का सम्मान करने और अपने प्रश्न के विवरणों का जवाब देने में *, यह मेरी सिफारिश है। –

+0

अभी भी प्रबुद्ध होने का इंतजार कर रहा है ... –

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