2008-11-04 12 views
18

मुझे इन-मेमोरी एचएसक्यूएल डेटाबेस में हर 5 सेकंड में कम से कम 8000 ऑब्जेक्ट्स की निरंतर दर पर वस्तुओं को सम्मिलित/अपडेट करने में सक्षम होना चाहिए।ओआरएम समाधान (जेपीए; हाइबरनेट) बनाम जेडीबीसी

मैंने वसंत/हाइबरनेट/जेपीए और शुद्ध जेडीबीसी के बीच कुछ तुलना प्रदर्शन परीक्षण किया है। मुझे एचएसक्यूएल का उपयोग करके प्रदर्शन में एक महत्वपूर्ण अंतर मिला है .. वसंत/हिब/जेपीए के साथ, मैं 5 सेकंड में अपने 1.5 केबी ऑब्जेक्ट्स (एक-कई और कई-कई रिश्तों के साथ) 3000-4000 डाल सकता हूं, जबकि सीधे जेडीबीसी कॉल मैं उन वस्तुओं के 10,000-12,000 डाल सकता हूं।

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

कोई विचार क्यों इतनी बड़ी विसंगति होगी?

+2

आप इस प्रश्न का नाम बदलना चाहेंगे क्योंकि शीर्षक वास्तविक प्रश्न का बहुत वर्णनात्मक नहीं है। –

+0

आप क्या सुझाव देंगे? – systemoutprintln

उत्तर

15

हमारे पास बैच मोड (स्टेटमेंट # executeBatch()) में जेडीबीसी के साथ हाइबरनेट की तुलना में समान अनुभव है। असल में, ऐसा लगता है कि हाइबरनेट बस थोक संचालन के साथ ऐसा नहीं करता है। हमारे मामले में, हाइबरनेट कार्यान्वयन हमारे उत्पादन हार्डवेयर पर पर्याप्त तेज़ था।

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

+1

क्या आपने हिब बैच भी किया था? मेरे परीक्षणों में हिब बैचों और जेडीबीसी बैच लगभग समान थे। –

5

हाइबरनेट गंदे जांच में उपयोग करने के साथ-साथ कार्य और पहचान मानचित्र की इकाई के रूप में कार्य करने के लिए वस्तुओं के पहले स्तर के कैश को बनाए रखता है। यह ओवरहेड में जोड़ता है, खासकर थोक-प्रकार के संचालन में। थोक संचालन के लिए, आप StatelessSessions की जांच कर सकते हैं जो इस स्थिति को बनाए रखता है।

+1

डॉक्स स्थानांतरित हो सकता है। http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch।एचटीएमएल – JavaRocky

2

यह सब मैपिंग ... यह सभी आर्केन तर्क और सभी प्रतिबिंब और स्थिरता-जांच के साथ थोड़ा महंगा हो सकता है।

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

9

न्यूनतम के रूप में, आपको हाइबरनेट में बैच आवेषण करने की आवश्यकता है: http://www.hibernate.org/hib_docs/reference/en/html/batch.html बहुत सारे राउंड-ट्रिप समय बचाता है।

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

+0

यह देख सकता है कि दस्तावेज़ चले गए हैं। यहां आज़माएं http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html – JavaRocky

+0

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

5

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

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