2010-07-11 10 views
16

मैं वर्तमान में अपने जावा ईई 6-एप्लिकेशन में सभी डेटाबेस संचालन को संभालने के लिए एक ईजेबी 3 डाटा एक्सेस क्लास बना रहा हूं। अब, चूंकि जावा ईई 6 नया एप्लीकेशनस्कोप्ड-एनोटेशन प्रदान करता है, मुझे आश्चर्य है कि मेरे ईजेबी के पास क्या राज्य होना चाहिए, या यदि यह स्टेटलेस होना चाहिए।जावाई 6 डीएओ: क्या यह @ स्टेटलेस या @ एप्प्लिकेशंस स्कॉप्ड होना चाहिए?

क्या डीएओ को @ स्टेटलेस सत्र बीन, या @ एप्प्लिकेशंसस्कोड बीन होने देना बेहतर होगा? @ सिंगलेटन के बारे में क्या? डीएओ से संबंधित इन विकल्पों के बीच अंतर क्या हैं?

संपादित करें: मैं Glassfish 3.0.1 का उपयोग कर रहा पूर्ण जावा ईई 6 मंच

उत्तर

12

साथ बेहतर हो whould डीएओ एक @Stateless सत्र बीन, या एक @ApplicationScoped बीन हो जाने के लिए ? @ सिंगलेटन के बारे में क्या? डीएओ से संबंधित इन विकल्पों के बीच अंतर क्या हैं?

मैं DAOs के लिए स्टेटलेस सत्र बीन्स का उपयोग नहीं होगा:

  1. EJBs कंटेनर से जमा कर रहे हैं, इसलिए यदि आप पूल प्रति एन उदाहरणों और टेबल के हजारों है, तो आप सिर्फ संसाधनों बर्बाद करने के लिए जा रहे हैं (तैनाती समय पर लागत का उल्लेख भी नहीं)।

  2. एसएलएसबी के रूप में डीएओ लागू करने से ईजेबी चेनिंग को प्रोत्साहित किया जाएगा जो स्केलेबिलिटी पॉइंट व्यू से अच्छा अभ्यास नहीं है।

  3. मैं डीएओ परत को ईजेबी एपीआई में नहीं जोड़ूंगा।

@Singleton EJB 3.1 में शुरू की चीज़ें थोड़ी बेहतर बना सकता है लेकिन मैं अभी भी EJBs रूप DAOs लागू नहीं होता। मैं बजाय सीडीआई (और शायद एक कस्टम स्टीरियोटाइप का उपयोग करूँगा, उदाहरण के लिए this article देखें)।

या मैं डीएओ का बिल्कुल उपयोग नहीं करता। जेपीए का इकाई प्रबंधक Domain Store पैटर्न का कार्यान्वयन है और डीएओ में किसी डोमेन स्टोर में रैपिंग पहुंच में बहुत अधिक मूल्य नहीं है।

+0

उत्तर के लिए धन्यवाद! यदि कोई डीएओ समझ में आता है तो मैं यहां चर्चा नहीं करना चाहता हूं। मेरे लिए यह एक का उपयोग करने के लिए समझ में आता है। कम से कम सीम 3 पर्सिस्टेंस मॉड्यूल उत्पादन के लिए तैयार है;) तो आप कहते हैं कि मुझे डीएओ परत को ईजेबी एपीआई में नहीं जोड़ना चाहिए। लेकिन लेनदेन और सुरक्षा के बारे में क्या? डेटाबेस संचालन के लिए नहीं, तो मैं उन सेवाओं का उपयोग कहां करूंगा -> डीएओ? ये सेवाएं सीडीआई द्वारा प्रदान नहीं की जाती हैं, कम से कम नियमित जावाई 6-कंटेनर प्रबंधन की तरह नहीं। या शायद मुझे सीडीआई और ईजेबी मिश्रण करना चाहिए? – ifischer

+0

@ifischer: डीएओ निश्चित रूप से लेनदेन नियंत्रण और सीमा (या सुरक्षा) के लिए जिम्मेदार नहीं होना चाहिए, इसके लिए एक एसएलएसबी (एक सत्र फेकाडे) का उपयोग करें। तो, हाँ, ईजेबी और सीडीआई का उपयोग करें। –

+5

> 'ईजेबी को कंटेनर द्वारा पूल किया जाता है, इसलिए यदि आपके पास पूल प्रति हजार उदाहरण हैं और हजारों टेबल हैं- 1. यदि आपके पास हजारों टेबल हैं, और हजारों इकाइयां आपको अपने डिज़ाइन को संशोधित करने की आवश्यकता हो सकती हैं। इसके अलावा, ईजेबी के उदाहरण आम तौर पर मांग पर बनाए जाते हैं और पहले से ही नहीं और निश्चित रूप से पूर्ण पूल क्षमता के लिए नहीं। फिर, भले ही उनमें से हजारों का निर्माण किया जाए, हजारों उदाहरणों की स्मृति आवश्यकताएं केवल एक मेगाबाइट है, जो पूरी तरह से महत्वहीन है। ऐप सर्वर शुरू करते समय एक छोटी सी अतिरिक्त लागत होती है (जो मैं लेता हूं वह समय है जिसे आप तैनाती के साथ लेते हैं) –

0

@ पास्कल: मेरी राय में मेरा डीएओ लेनदेन या सुरक्षा का "ज़िम्मेदार" नहीं है, क्योंकि कंटेनर इन सेवाओं का प्रबंधन करता है। मैं सिर्फ अपने डीएओ में विधियों की व्याख्या कर रहा हूं (केवल सुरक्षा के लिए, क्योंकि लेन-देन स्वचालित रूप से संभाले जाते हैं)। एनोटेशन पहले से ही "ज़िम्मेदारी" हैं?

ठीक है तो आप मुझे अपने डिजाइन के बारे में फिर से सोचने के लिए तैयार करते हैं। आशा है कि इसके ठीक और भी विषय से हटकर नहीं है, लेकिन शायद यह मदद करता है - यह मैं कैसे आज JEE6 उपयोग कर रहा हूँ है:

  • JSF तक पहुँचता है एक CDI बीन,
  • CDI बीन डीएओ-EJB तक पहुँचता है जो क्या "व्यापार तर्क"
  • इसलिए वर्तमान में मेरा एकमात्र "व्यवसाय तर्क" सीआरयूडी कर रहा है, बाद में मैं कुछ अन्य ईजेबी को एसिंक्रोनस विधियों या टाइमर सेवाओं जैसे महत्वपूर्ण कार्यों के लिए जोड़ दूंगा।
  • मेरी डीएओ सामान्य है और typesafe प्रश्नों (किसी शर्त सभी)
  • मुझे पता है कि मैं एक डीएओ के लिए/अद्यतन/हटाने (बहुत सरल) जारी रहती है की जरूरत नहीं है करने के लिए JPA2 मानदंड क्वेरी का उपयोग करता है, लेकिन मैं जरूरत यह मेरे प्रश्नों के लिए; इसलिए मैंने उन्हें एक साथ रखा

क्या उस दृष्टिकोण के साथ कुछ गलत है?

1

कुछ पुनर्विचार के बाद, ऐसा लगता है कि डीएओ वास्तव में सही काम नहीं है जो मैं करना चाहता था। पास्कल ने कहा, शायद यह वास्तव में एक फेकाडे है। मुझे अभी नेटबीन्स पेटस्टोर उदाहरण मिला - एक जावाईई 6 नमूना आवेदन, here देखें - जहां उनके पास आइटमफैक्ड है जो डेटाबेस से इकाइयों को ढूंढने/बनाने/निकालने के लिए ज़िम्मेदार है। यह एक स्टेटलेस सत्र बीन है। इस तरह दिखता है:

@Stateless 
public class ItemFacade implements Serializable { 
    @PersistenceContext(unitName = "catalogPU") 
    private EntityManager em; 

    public void create(Item item) { ... } 
    public void edit(Item item) { ... } 
    public void remove(Item item) { ... } 
    public Item find(Object id) { ... } 
    public List<Item> findAll() { ... } 
    public List<Item> findRange(int maxResults, int firstResult) { ... } 
    public int getItemCount() { ... } 
} 

तो एक निष्कर्ष के रूप में मैं अपने डीएओ डीएओ अब कहते हैं नहीं, लेकिन इसके बजाय सिर्फ उदाहरण के लिए PersonEJB (मुझे लगता है कि "PersonFacade" गलत समझा जा सकता है) और यह भी कर @Stateless, के रूप में मुझे लगता है कि Netbeans उदाहरण के रूप में अच्छी तरह से डिजाइन किया जा सकता है।

+0

मेरे उत्तर का अंतिम भाग कौन सा है: कोई भी डीएओ बिल्कुल नहीं और एक [सत्र मुखौटा] (http: //java.sun। कॉम/ब्लूप्रिंट/कोरज 2पेटर्न/पैटर्न/सत्र Facade.html) लेनदेन नियंत्रण और सुरक्षा के लिए, एक एसएलएसबी जावा ईई में प्राकृतिक उम्मीदवार है। अब, मुझे पहले कहना है कि उपरोक्त उत्तर वास्तव में आपके * प्रारंभिक * प्रश्न और दूसरे का जवाब नहीं देता है, (वस्तुतः) अपने उत्तर से मेल खाने के लिए अपने स्वयं के प्रश्न को दोबारा दर्ज करने से मुझे इस पर अधिक समय बिताने के लिए प्रेरित नहीं किया जाता है। वैसे भी शुभकामनाएँ। –

+1

स्वीकृत उत्तर बदल दिया। तुम अब खुश हो ;) आप सही हैं, इस उत्तर के मेरे प्रारंभिक उत्तर से कोई लेना देना नहीं है। आपकी सहायता के लिए धन्यवाद. – ifischer

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