2009-08-30 12 views
58

मेरे पास एक मोटी क्लाइंट, जावा स्विंग एप्लिकेशन 25 टेबल की स्कीमा और ~ 15 जे इन्टरनेटफ्रेम (टेबल के लिए डेटा एंट्री फॉर्म) है। मुझे डीबीएमएस इंटरैक्शन के लिए सीधे जेडीबीसी या ओआरएम (इस मामले में वसंत ढांचे के साथ हाइबरनेट) की डिज़ाइन पसंद करने की आवश्यकता है। आवेदन से बाहर भविष्य में निर्माण होगा।हाइबरनेट या जेडीबीसी

हाइबरनेट इस आकार की एक परियोजना के लिए ओवरकिल होगा? हां या कोई जवाब का स्पष्टीकरण बहुत सराहना की जाएगी (या वारंट होने पर भी एक अलग दृष्टिकोण)।

टीआईए।

+0

अन्य संभावनाएं हैं। IBATIS http://iBATIS.apache.org/ –

+0

ओवरकिल के बारे में क्या? संकल्पनात्मक ओवरकिल? एक और जार? – Surya

+1

मैं एक परत जोड़ने के लिए अतिरिक्त प्रसंस्करण ओवरहेड में ओवरकिल सोच रहा था, इसे बनाए रखने के लिए आवश्यक अतिरिक्त डेवलपर कौशल (मेरे पास कौशल है, लेकिन मुझे इसके बारे में सोचना है कि जब मैं इसे बनाए रखने वाला नहीं हूं), इसके बजाय एक तृतीय पक्ष के साथ मिलकर मूल (हालांकि अतिरिक्त जार AFAIC कोई मुद्दा नहीं हैं)। उस तरह की चीज। अच्छी पूछताछ रवैये के लिए – jmq

उत्तर

164

अच्छा प्रश्न का चयन करेंगे।

मैं कई वर्षों में कई परियोजनाओं में इसका उपयोग करने के बाद हाइबरनेट का एक बड़ा प्रशंसक था। मुझे विश्वास था कि किसी भी परियोजना को हाइबरनेट करने के लिए डिफ़ॉल्ट होना चाहिए।

आज मुझे इतना यकीन नहीं है।

कुछ चीजों के लिए हाइबरनेट (और जेपीए) बहुत बढ़िया है, खासकर विकास चक्र में। जेडीबीसी के साथ हाइबरनेट के साथ काम करने के लिए कुछ तेज़ है। आपको मुफ्त - कैशिंग, आशावादी लॉकिंग आदि के लिए बहुत सारी सुविधाएं मिलती हैं।

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

प्रदर्शन

क्रम प्रदर्शन अच्छा है पर्याप्त, मैं अभी तक एक स्थिति है जहाँ हाइबरनेट उत्पादन में खराब प्रदर्शन का कारण था यह देखने के लिए की है। समस्या स्टार्टअप प्रदर्शन है और यह आपके यूनिट परीक्षण समय और विकास प्रदर्शन को कैसे प्रभावित करती है। जब हाइबरनेट लोड होता है तो यह सभी इकाइयों का विश्लेषण करता है और बहुत से प्री-कैशिंग करता है - इसमें बहुत अधिक आवेदन के लिए लगभग 5-10-15 सेकंड लग सकते हैं। तो आपका 1 सेकंड यूनिट टेस्ट अब 11 सेकेंड लेने जा रहा है। मज़ा नहीं।

डाटाबेस स्वावलंबन

यह जब तक आप डेटाबेस पर कुछ ट्यूनिंग क्या करने की जरूरत नहीं है के रूप में बहुत अच्छा है।

में स्मृति सत्र

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

Cascades

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

लेज़ी लोड हो रहा है

लेज़ी लोड हो रहा है इसका मतलब है कि हर बार जब आप एक वस्तु लोड, हाइबरनेट सब यह संबंधित है वस्तुओं लोड नहीं होगा, लेकिन इसके बजाय जगह धारकों जो जैसे ही आप उन तक पहुंचने की कोशिश का समाधान हो जाएगा प्रदान करेगा। महान अनुकूलन सही है? यह है, सिवाय इसके कि आपको इस व्यवहार से अवगत होना चाहिए अन्यथा आपको गुप्त त्रुटियां मिलेंगी। एक उदाहरण के लिए Google "LazyInitializationException"। और प्रदर्शन के साथ सावधान रहें। आप अपनी ऑब्जेक्ट्स और ऑब्जेक्ट ग्राफ़ को कैसे लोड करते हैं, इसके आधार पर आप "n + 1 समस्या का चयन कर सकते हैं" दबा सकते हैं। अधिक जानकारी के लिए Google इसे।

स्कीमा उन्नयन

हाइबरनेट सिर्फ पुनर्रचना जावा कोड और पुनरारंभ द्वारा आसान स्कीमा परिवर्तन की अनुमति देता है। जब आप शुरू करते हैं तो यह बहुत अच्छा होता है। लेकिन फिर आप संस्करण एक जारी करते हैं। और जब तक कि आप अपने ग्राहकों को खोना नहीं चाहते हैं, आपको स्कीमा अपग्रेड स्क्रिप्ट प्रदान करने की आवश्यकता है। जिसका मतलब है कि कोई भी सरल रिफैक्टरिंग नहीं है क्योंकि सभी स्कीमा परिवर्तन SQL में किए जाने चाहिए।

दृश्य और संग्रहित प्रक्रियाओं

हाइबरनेट डेटा यह साथ काम करता है के लिए विशेष लेखन पहुँच की आवश्यकता है। जिसका अर्थ है कि आप वास्तव में विचारों, संग्रहित प्रक्रियाओं और ट्रिगर्स का उपयोग नहीं कर सकते हैं क्योंकि इससे हाइबरनेट के डेटा में परिवर्तन हो सकता है, जो उन्हें नहीं जानते हैं। अलग-अलग लेन-देन में डेटाबेस में डेटा लिखने के लिए आप कुछ बाहरी प्रक्रियाएं कर सकते हैं। लेकिन यदि आप करते हैं, तो आपके कैश में अमान्य डेटा होगा। देखभाल करने के लिए एक और बात कौन सा है।

एकल पिरोया सत्र

हाइबरनेट सत्र एकल पिरोया जाता है। किसी सत्र के माध्यम से लोड की गई किसी ऑब्जेक्ट को केवल उसी थ्रेड से एक्सेस किया जा सकता है (पढ़ने सहित)। यह सर्वर साइड अनुप्रयोगों के लिए स्वीकार्य है लेकिन यदि आप जीयूआई आधारित आवेदन कर रहे हैं तो चीजों को अनावश्यक जटिल बना सकते हैं।

मुझे लगता है कि मेरा बिंदु यह है कि कोई निःशुल्क भोजन नहीं है।

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

+2

+1 ग्रेट उत्तर .. मुझे लगता है कि हाइबरनेट कभी भी सबसे अच्छी बात थी, लेकिन जैसे ही हमारा आवेदन जटिलता (बड़ा ऑब्जेक्ट ग्राफ) में बढ़ गया, मैं कुछ परिदृश्यों में भाग गया जहां डीबगिंग एक दुःस्वप्न था क्योंकि मुझे नहीं पता था कि हाइबरनेट कर रहा था। (सौभाग्य से, यह खुला स्रोत है इसलिए मैं इसे समझने के लिए स्रोत के माध्यम से खोदने में सक्षम था। मज़ा नहीं) वैसे भी, मैं सहमत हूं .. कोई नि: शुल्क भोजन नहीं। हाइबरनेट महान है, लेकिन ट्रेडऑफ हैं। – delux247

+0

क्या यह अभी भी Google पर पहली हिट के बाद से अद्यतित है? – PowerFlower

16

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

यदि आप एसक्यूएल के साथ सहज हैं तो मैं दृढ़ता से सुझाव दूंगा कि आप Ibatis पर एक नज़र डालें। यह 90% + हाइबरनेट क्या कर सकता है लेकिन कार्यान्वयन में कहीं अधिक सरल है।

मैं एक कारण से नहीं सोच सकता कि मैं कभी भी इबैटिस पर सीधे जेडीबीसी (या यहां तक ​​कि वसंत जेडीबीसी) का चयन क्यों करूंगा। हाइबरनेट एक और जटिल विकल्प है।

Spring and Ibatis Tutorial पर एक नज़र डालें।

+0

धन्यवाद, मैं इबातिस की जांच करूंगा। – jmq

4

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

जहां हाइबरनेट वास्तव में मेरे लिए चमकता है, संस्थाओं/तालिकाओं के बीच संबंधों से निपट रहा है। यदि आप माता-पिता और बच्चों (पोते, भाई बहन इत्यादि) को एक ही समय में संशोधित करने के साथ सौदा करते हैं तो हाथ से जेडीबीसी करना बहुत सारे कोड ले सकता है। हाइबरनेट इसे एक हवा बना सकता है (प्रायः मूल इकाई की एक ही बचत पर्याप्त होती है)।

हालांकि हाइबरनेट से निपटने के दौरान निश्चित रूप से जटिलताएं हैं, जैसे कि सत्र फ़्लशिंग कैसे काम करता है, और आलसी लोडिंग से निपटने में जटिलताएं होती हैं।

2

सीधे जेडीबीसी सबसे सरल मामलों में सबसे अच्छा फिट होगा।

यदि आप जावा और ओओडी के भीतर रहना चाहते हैं तो हाइबरनेट या हाइबरनेट/जेपीए या किसी अन्य-जेपीए-प्रदाता/जेपीए को अपनी पसंद होना चाहिए।

यदि आप एसक्यूएल के साथ अधिक आरामदायक हैं तो जेडीबीसी टेम्पलेट्स के लिए वसंत और अन्य एसक्यूएल उन्मुख ढांचे को चोट नहीं पहुंचीगी।

इसके विपरीत, लेनदेन नियंत्रण के अलावा, जेपीए के साथ काम करते समय वसंत होने में बहुत मदद नहीं है।

10

इसमें कोई संदेह नहीं है कि हाइबरनेट की इसकी जटिलता है।

लेकिन मुझे वास्तव में हाइबरनेट दृष्टिकोण (कुछ अन्य लोगों) के बारे में क्या पसंद है, यह वैचारिक मॉडल है जिसे आप जावा में प्राप्त कर सकते हैं। हालांकि मैं ओओओ को पैनसिया के रूप में नहीं सोचता, और मैं डिजाइन की सैद्धांतिक शुद्धता की तलाश नहीं करता, मुझे कई बार पता चला कि ओओ वास्तव में मेरे कोड को सरल बना देता है। आपको जानकारी के लिए विशेष रूप से कहा कि के रूप में, यहाँ कुछ उदाहरण हैं:

  • उदाहरण के लिए सभी संस्थाओं जोड़ तोड़ के लिए जटिलता मॉडल और संस्थाओं में नहीं है, लेकिन अपने ढांचे में। रखरखाव के लिए, कठिन हिस्सा कुछ ढांचे वर्ग नहीं बल्कि आपका मॉडल है, इसलिए हाइबरनेट आपको हार्ड हिस्से (मॉडल) को अपने सबसे साफ रखने की अनुमति देता है।

  • अगर एक क्षेत्र (एक आईडी, या लेखा परीक्षा क्षेत्रों, आदि जैसे) अपने सभी संस्थाओं में प्रयोग किया जाता है, तो आप एक सुपर क्लास इसके साथ बना सकते हैं। इसलिए:

    • आप कम कोड लिखने, लेकिन अधिक महत्वपूर्ण बात ...
    • वहाँ अपने मॉडल में कम अवधारणाओं हैं मुक्त करने के लिए
    • (अनूठी अवधारणा कोड में अद्वितीय है), तो आप कोड अधिक लिख सकते हैं जेनेरिक, जो किसी इकाई (अज्ञात, कोई प्रकार-स्विचिंग या कास्ट) प्रदान नहीं करता है, आपको आईडी तक पहुंचने की अनुमति देता है।
  • हाइबरनेट (, अभी या बाद में उन्हें केवल रूप में की जरूरत को जोड़ने) अन्य मॉडल caracteristics आपको आवश्यकता हो सकती से निपटने के लिए भी कई विशेषताएं है। इसे अपने डिजाइन के लिए एक्स्टेंसिबिलिटी गुणवत्ता के रूप में लें।

    • आप संरचना द्वारा विरासत (उप-वर्गीकरण) को प्रतिस्थापित कर सकते हैं (एक ही सदस्य होने वाली कई संस्थाएं, जिनमें कुछ संस्थाएं होती हैं जो कई इकाइयों में आवश्यक होती हैं)।
    • आपकी कुछ इकाइयों के बीच विरासत हो सकती है। यह अक्सर होता है कि आपके पास दो टेबल हैं जिनमें बहुत अधिक संरचना है (लेकिन आप एक ही टेबल में सभी डेटा स्टोर नहीं करना चाहते हैं, क्योंकि आप एक अलग पैरेंट टेबल पर रेफरेंसियल अखंडता खो देंगे)।
  • अपने संस्थाओं के बीच पुन: उपयोग के साथ

    (लेकिन केवल उचित विरासत, और रचना), वहां आम तौर पर कुछ अतिरिक्त फायदे आने के लिए है। उदाहरण:

    • अक्सर समान रूप से अलग-अलग इकाइयों के डेटा को पढ़ने का कोई तरीका होता है। मान लीजिए कि मैंने तीन इकाइयों के लिए "शीर्षक" फ़ील्ड पढ़ा है, लेकिन कुछ के लिए मैं परिणाम को एक अलग डिफ़ॉल्ट मान के साथ बदल देता हूं यदि यह शून्य है। "GetActualTitle" (सुपरक्लस या इंटरफ़ेस में) हस्ताक्षर करना आसान है, और तीन कार्यान्वयन में डिफ़ॉल्ट मान हैंडलिंग को कार्यान्वित करना आसान है। इसका मतलब है कि मेरी संस्थाओं का कोड सिर्फ "वास्तविक शीर्षक" की अवधारणा से संबंधित है (मैंने इस कार्यात्मक अवधारणा को स्पष्ट किया है), और विधि विरासत सही कोड निष्पादित करने का ख्याल रखती है (कोई स्विच या यदि कोई कोड डुप्लिकेशन नहीं है) ।
    • ...
  • समय के साथ

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

इन सभी कारणों के लिए, मैं कोई भी सरल जवाब के साथ हाइबरनेट :-)

0

... इन-स्मृति सत्र ... LazyInitializationException ...

आप Ebean ORM पर दिखाई दे सकता है जो सत्र वस्तुओं का उपयोग नहीं करता है ... और जहां आलसी लोड हो रहा है बस काम करता है। निश्चित रूप से एक विकल्प, अधिक नहीं, और समझने के लिए आसान हो जाएगा।

3

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

+0

जब परीक्षण या डिबगिंग की बात आती है, तो क्या आपको पता चलेगा कि यह क्या सिरदर्द होगा? जावा 1 के रिलीज के साथ – Reborn

0
  1. JDBC में, हम एक डेटाबेस कनेक्शन हम कोशिश में लिखने की ज़रूरत खोलें, और अगर है, तो किसी भी अपवाद कैच ब्लॉक हुआ होगा इसके बारे में लेने, और अंत में कनेक्शन बंद करने के लिए इस्तेमाल किया।

  2. JDBC सभी अपवाद अपवाद जाँच कर रहे हैं, इसलिए हम कोशिश में कोड लिखना चाहिए में, पकड़ और फेंकता है, लेकिन हाइबरनेट में हम केवल संयुक्त राष्ट्र के जाँच कर ली है अपवाद

  3. एक प्रोग्रामर हम कनेक्शन को बंद करना होगा के रूप में

    यहाँ, या हमें हमारे कनेक्शन संदेश प्राप्त करने का मौका मिल सकता है ...!

  4. असल में अगर हमने अंत में ब्लॉक में कनेक्शन बंद नहीं किया है, तो jdbc उस कनेक्शन को बंद करने के लिए ज़िम्मेदार नहीं है।

  5. जेडीबीसी में हमें विभिन्न स्थानों पर एसक्यूएल कमांड लिखने की जरूरत है, यदि तालिका संरचना संशोधित की गई है तो प्रोग्राम बनाया गया है, तो जेडीबीसी प्रोग्राम काम नहीं करता है, फिर हमें संशोधित करने और संकलित करने और फिर से तैनात करने की आवश्यकता है, जो थकाऊ है।

  6. यदि कोई अपवाद होता है तो जेडीबीसी डाटाबेस से संबंधित त्रुटि कोड उत्पन्न करता था, लेकिन जावा प्रोग्रामर इस त्रुटि कोड के बारे में अज्ञात हैं।

  7. जब हम किसी भी रिकॉर्ड को सम्मिलित कर रहे हैं, यदि हमारे पास डेटाबेस में कोई विशेष तालिका नहीं है, तो जेडीबीसी "मौजूद नहीं है" जैसी त्रुटि उत्पन्न करेगी, और अपवाद फेंकता है, लेकिन हाइबरनेट के मामले में, यदि यह नहीं है किसी भी तालिका डेटाबेस में यह हमें

  8. JDBC समर्थन आलसी लोड करने के लिए टेबल बना सकते हैं और हाइबरनेट उत्सुक लोड हो रहा है

  9. हाइबरनेट विरासत, संघों का समर्थन करता है समर्थन करता है, होगा, संग्रह

  10. हाइबरनेट में अगर हम बचाने पाया व्युत्पन्न कक्षा ओ bject, तो इसके बेस क्लास ऑब्जेक्ट को डेटाबेस में भी संग्रहीत किया जाएगा, इसका मतलब है कि सहायक विरासत

  11. हाइबरनेट एक-टू-वन, वन-टू-वन, कई से कई-कई लोगों के रिश्तों का समर्थन करता है , कई-टू-वन

  12. हाइबरनेट इस द्वारा कैशिंग तंत्र का समर्थन करता है, एक आवेदन और डेटाबेस के बीच दौर यात्राएं की संख्या कम हो जाएगा इस कैशिंग तकनीक का उपयोग करके, एक आवेदन प्रदर्शन स्वचालित रूप से बढ़ जाएगी

  13. हाइबरनेट में अंकन प्राप्त करना काफी सरल है।

  14. हाइबरनेट क्षमता प्राथमिक कुंजी उत्पन्न करने के लिए स्वचालित रूप से होगा, जबकि हम अगर उपयोगकर्ता के अरबों तो ऐप्लिकेशन या वेब बाहर का उपयोग कर JDBC क्वेरी में मार डाला समय की लेकिन हाइबरनेट में अरबों हो जाएगी डेटाबेस

+0

बहुत उद्देश्य xD – amdev

+0

।7 और इसकी सुविधा संसाधनों के साथ प्रयास करें। तर्क 1,3 और 4 अब कोई समस्या नहीं है – Reborn

0

में रिकॉर्ड भंडारण कर रहे हैं क्वेरी किसी भी संख्या में उपयोगकर्ता को जेडीबीसी पर हाइबरनेट के सबसे महत्वपूर्ण और आसान लाभ के लिए केवल एक बार निष्पादित की जाएगी।

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