2010-03-26 10 views
10

हाय मैं कुछ डीबी परिचालनों के लिए दाओ कक्षाएं उत्पन्न करता हूंदाओ कक्षा में स्टेटिक विधियों या कोई स्थिर तरीकों का उपयोग करना?

इस तरह दाओ वर्ग के तरीके स्थिर या कोई स्थिर नहीं है?

नीचे दिए गए नमूना दाव वर्ग का उपयोग करना, अगर एक से अधिक ग्राहकों को एक ही समय में AddSampleItem विधि का उपयोग करने है? यह कैसे हो सकता है?

public class SampleDao 
{ 
    static DataAcessor dataAcessor 

    public static void AddSampleItem(object[] params) 
    { 
     dataAcessor =new DataAcessor(); 
     //generate query here 
     string query="..." 
     dataAcessor.ExecuteQery(query); 
     dataAcessor.Close(); 
    } 

    public static void UpdateSampleItem(object[] params) 
    { 
     dataAcessor =new DataAcessor(); 
     //generate query here 
     string query="..." 
     dataAcessor.ExecuteQery(query); 
     dataAcessor.Close(); 
    } 
} 

उत्तर

9

यह एक बड़ी गड़बड़ में परिणाम होगा। यदि आप अलग-अलग धागे से एक साथ 2 आइटम जोड़ रहे हैं, तो आप निश्चित रूप से बहुत ही अजीब परिणाम, या यहां तक ​​कि त्रुटियों के साथ समाप्त हो जाएंगे यदि एक थ्रेड DataAcessor को दूसरे पूर्ण होने से पहले बंद कर देता है।

मैं स्थानीय DataAcessor का उपयोग करता हूं या एक नया निर्माण करता हूं और DataAcessor के जीवनकाल को प्रबंधित करने के तरीके के आधार पर सभी विधियों में इसका उपयोग करता हूं।

public class SampleDao 
{ 
    public void AddSampleItem(object[] params) 
    { 
     DataAcessor dataAcessor =new DataAcessor(); 
     // ... 
    } 

    public void UpdateSampleItem(object[] params) 
    { 
     DataAcessor dataAcessor =new DataAcessor(); 
     // ... 
    } 
} 
2

यह कोड आपके द्वारा लिखे गए तरीके से सुरक्षित नहीं है।

अगर आप dataAccessor क्षेत्र और तरीकों इस तरह स्थिर है, तो आप कई ग्राहकों एक ही समय में इस कोड को मारने के साथ संगामिति समस्याओं होगा। यह संभावना है कि आपके पास बहुत ही अजीब अपवाद होंगे, और यहां तक ​​कि संभव है कि एक ग्राहक दूसरे ग्राहक के डेटा को देख सके।

इन तरीकों और इस क्षेत्र पर स्थिर से छुटकारा और प्रत्येक ग्राहक के लिए SampleDao का एक नया उदाहरण का दृष्टांत मिलता है।

5

मैं हमेशा गैर स्थैतिक वर्ग पसंद करता हूं। निर्भरता को स्थैतिक वर्ग में इंजेक्शन नहीं दिया जा सकता है और यूनिट परीक्षण कठिन होते हैं। इसके अलावा, जब यूनिट परीक्षण किए जाते हैं तो इसके ग्राहक इसे परीक्षण डबल के साथ प्रतिस्थापित नहीं कर सकते हैं।

http://googletesting.blogspot.com/2008/12/static-methods-are-death-to-testability.html

0

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

Daos, उन मामलों में मैं Daos में गैर स्थिर तरीकों होने का कोई मतलब नहीं देख stateless.In क्योंकि हम अपनी विधि का उपयोग करने की है कि दाव का एक उदाहरण बनाने की आवश्यकता कर रहे हैं।

0

ब्रूनो सही है। हालांकि, आप एक सिंगलटन भी जोड़ सकते हैं और अपने ऐप के उस हिस्से को सिंगल-थ्रेड में "लॉक" का उपयोग कर सकते हैं। ध्यान रखें, हालांकि, अनुरोध कतार में जा रहे हैं और यदि आपकी क्वेरी में समय लगता है तो आपके ऐप का प्रदर्शन घट जाएगा। यह विशेष रूप से एक वेब ऐप में ध्यान देने योग्य है। मोबाइल या डेस्कटॉप ऐप "लॉक" के लिए निश्चित रूप से उपयुक्त है।

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