मैंने देखा है और बहुत पुराने, जेडीबीसी-आधारित डीएओ कोड के साथ काम किया है जो आमतौर पर सीआरयूडी विधियों के साथ शुरू होता है। मेरा प्रश्न विशेष रूप से पुनर्प्राप्ति विधियों, या 'खोजकर्ता' से संबंधित है। आमतौर पर मैं क्या लगता है कि DAOs दो तरीकों के साथ शुरू होता है:डीएओ पैटर्न और ओपन-क्लोज़ेड सिद्धांत
- खोजें और लौट सभी
- एक अद्वितीय पहचानकर्ता के आधार पर एक विशिष्ट उदाहरण को पुनः प्राप्त
, उन दो ढूँढ़ने वाले अपर्याप्त हैं मैं आमतौर पर एक डीएओ वर्ग बार-बार इस तरह का खोजक विधियों को जोड़ने के लिए संशोधित देखकर अंत:
- ढूंढें और सभी लौट जहां {हालत}
क्या होता है कि अधिक तरीकों जोड़ रहे हैं तब होता है जब एक नया { शर्तों को} समर्थित करने की आवश्यकता है या अतिरिक्त विधियों को समर्थन देने के लिए विधि के अंदर SQL क्वेरी को संशोधित करने के लिए झंडे के रूप में नए पैरामीटर जोड़ने के लिए मौजूदा विधियों को संशोधित किया गया है।
यह एक बदसूरत दृष्टिकोण है और ओपन-क्लोज़ेड सिद्धांत का उल्लंघन करता है। जब भी कुछ नई पुनर्प्राप्ति स्थिति को समर्थित करने की आवश्यकता होती है तो यह हमेशा डीएओ कक्षाओं को लगातार संशोधित करने का एक आवरण रहा है। इस प्रश्न पर शोध अक्सर मुझे रिपोजिटरी पैटर्न और Specifications या क्वेरी ऑब्जेक्ट्स के रूप में पुनर्प्राप्ति के लिए शर्तों को समाहित करने के लिए इंगित करता है, फिर उन्हें खोजक विधि में भेजता है। लेकिन यह केवल तभी संभव लगता है जब आपके पास संपूर्ण डेटा सेट का इन-मेमोरी संग्रह हो या यदि आप किसी प्रकार का ओआरएम (मैं पुराने जेडीबीसी कोड के साथ काम कर रहा हूं)
मैंने एक समाधान माना है जो आलसी भार संपूर्ण डेटा एक डीएओ सेट-मेमोरी के रूप में प्रबंधित करता है और उसके बाद पुनर्प्राप्ति पैटर्न का उपयोग पुनर्प्राप्ति के लिए क्वेरी के रूप में करता है। मैं तब संग्रह पर किसी प्रकार का पर्यवेक्षक लागू करता हूं जो बनाता है, अपडेट या हटाए जाने वाले तरीकों को कॉल करते समय डेटाबेस को अद्यतन करता है। लेकिन जाहिर है प्रदर्शन और मापनीयता काफी पीड़ित हैं।
इस पर कोई विचार?
अब तक प्रतिक्रियाओं के लिए धन्यवाद। मेरे पास एक विचार है - डेटा एक्सेस अनुरोधों को समाहित करने के लिए कमांड/नीति पैटर्न के उपयोग पर आपकी राय क्या है? प्रत्येक व्यक्तिगत कंक्रीट कमांड एक विशिष्ट प्रकार की पहुंच का प्रतिनिधित्व कर सकता है और इसे एक आवेदक को पास किया जा सकता है। मैं कई कंक्रीट कमांड कक्षाओं के साथ समाप्त हो जाऊंगा, लेकिन प्रत्येक व्यक्ति केवल एक तरह की पहुंच पर केंद्रित होगा और बहुत टेस्टेबल और अलग होना चाहिए।
public abstract class Command<R>{
public <R> execute();
public void setArguments(CommandArguments args){
//store arguments
}
}
//map based structure for storing and returning arguments
public class CommandArguments{
public String getAsString(String key);
public String getAsInt(String key);
//... others
}
//In some business class...
Command command = CommandFactory.create("SearchByName");
CommandArguments args = new CommandArguments();
args.setValue("name", name);
// others
command.setArguments(args);
List<Customer> list = command.execute();
+1 मैं iBatis में एक ही बात किया है, वैकल्पिक तिथि सीमाओं, वैकल्पिक तरह विधेय, और इतने पर समर्थन कर रहा। यह अच्छा काम करता है। (BTW, आप अपने उदाहरण में प्राथमिक कुंजी शर्त नहीं देना चाहते।) –
मुझे लगता है कि यह अपेक्षाकृत सरल जहां खंड में काम कर सकता था। लेकिन यदि परिस्थितियां अधिक जटिल हो जाती हैं या जब कुछ पुनर्प्राप्ति किसी अन्य तालिका से जुड़ने पर निर्भर करती हैं तो स्केल करना मुश्किल होगा। उदाहरण के लिए, मेरे पास एक ग्राहक डीडी हो सकता है जो सिर्फ नाम के आधार पर ग्राहकों को पुनर्प्राप्त करता है। लेकिन क्या होगा यदि मैं बकाया शेष राशि के आधार पर एक ग्राहक को पुनः प्राप्त करना चाहता हूं जिसे किसी अन्य तालिका से जानकारी की आवश्यकता होगी। मैं अपने डीएओ के अंदर एक जटिल क्वेरी बिल्डर को समाप्त कर दूंगा जो कि पारित किए जा सकने वाले विभिन्न विभिन्न मानकों की अपेक्षा कर सकता है। –
@ एप्लोज़ाडा सच है कि आपको और विकल्पों की आवश्यकता होगी, तो आपका प्रश्न सरल सीआरयूडी और यह कैसे विस्तार करता है संदर्भित करना शुरू कर देता है। आपके जुड़ने वाले टेबल उदाहरण के लिए आपके पास एक अलग खोजक विधि हो सकती है और फिर उस पर पैरामीटर भी हो सकते हैं। यदि आप एक विधि कॉल की तलाश में हैं जो सभी संभावित परिदृश्यों को पूरा करेगा, तो आप अपनी ग्राहक तालिका को लिंक किए गए तालिकाओं के साथ पूछताछ के लिए विचार कर सकते हैं, मुझे लगता है कि यह बेहद जटिल हो सकता है। आपके डीएओ में अलग-अलग तरीके उस आईएमएचओ के लिए बेहतर है। अधिक जटिल परिस्थितियों के लिए विधि का नाम उपभोक्ता को प्रश्न के प्रकार को इंगित करेगा – MadMurf