2009-01-23 13 views
16

मेरे पास एक जावा प्रोग्राम है जिसमें लगभग 15 तरीके शामिल हैं। और, कार्यक्रम की बहिष्कार के दौरान इन विधियों को अक्सर बार-बार बुलाया जाता है। फिलहाल, मैं हर विधि में एक नया कनेक्शन बना रहा हूं और उन पर बयान का आह्वान कर रहा हूं (डाटाबेस नेटवर्क पर दूसरी मशीन पर सेट है)।जावा में कितने जेडीबीसी कनेक्शन?

मैं क्या जानना चाहता हूं: क्या मुझे मुख्य विधि में केवल एक कनेक्शन बनाना चाहिए और इसे उन सभी विधियों के लिए तर्क के रूप में पास करना चाहिए जिनके लिए कनेक्शन ऑब्जेक्ट की आवश्यकता होती है क्योंकि इससे प्रोग्राम में कनेक्शन ऑब्जेक्ट की संख्या में काफी कमी आएगी , हर विधि में अक्सर कनेक्शन बनाने और बंद करने की बजाय।

मुझे संदेह है कि मैं वर्तमान डिजाइन के साथ संसाधनों का बहुत कुशलता से उपयोग नहीं कर रहा हूं, और इस कार्यक्रम में भविष्य में बहुत कुछ बढ़ सकता है, इस पर विचार करने के लिए बहुत सारे दायरे हैं।

उत्तर

21

हां, आपको प्रत्येक बार एक नया निर्माण करने के बजाय कनेक्शन का पुनः उपयोग करने पर विचार करना चाहिए। सामान्य प्रक्रिया है:

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

    • अनुकूलतम प्रदर्शन के लिए, आपको सावधान रहने की जरूरत है: मैं वास्तव में एक उदाहरण मुझे लगता है कि आप अपने उद्देश्य

    व्यावहारिक दृष्टिकोण के एक जोड़े को खुद को अनुकूलित कर साथ managing a resource pool with a Semaphore पर अपने वेब साइट पर एक संक्षिप्त लेख है एक कनेक्शन को "हॉग" नहीं करना है, जबकि आप वास्तव में क्वेरी चलाने के लिए इसका उपयोग नहीं कर रहे हैं। यदि आप एक बार पूल से कनेक्शन लेते हैं और फिर इसे विभिन्न तरीकों से पास करते हैं, तो आपको यह सुनिश्चित करना होगा कि आप गलती से ऐसा नहीं कर रहे हैं।

  • पूल से अपने कनेक्शन वापस करने के लिए मत भूलना! (कोशिश करें/आखिर में आपका मित्र है ...)
  • कई प्रणालियों पर, आप कनेक्शन को 'हमेशा के लिए' खोल नहीं सकते: ओ/एस कुछ अधिकतम समय के बाद उन्हें बंद कर देगा। तो आपके 'पूल से कनेक्शन वापस करें' विधि में, आपको 'सेवानिवृत्त' कनेक्शन के बारे में सोचना होगा जो लंबे समय से (याद रखने के लिए कुछ तंत्र में निर्मित है, उदाहरण के लिए रैपर ऑब्जेक्ट एक वास्तविक जेडीबीसी कनेक्शन ऑब्जेक्ट के आसपास जो आप इस तरह के मीट्रिक को स्टोर करने के लिए उपयोग कर सकते हैं)
  • आप तैयार कथन का उपयोग करने पर विचार करना चाह सकते हैं।
  • समय के साथ, आप शायद करने की आवश्यकता होगी कनेक्शन पूल आकार tweak
+0

क्या आप विस्तृत कर सकते हैं कि तैयार वक्तव्य कैसे मदद कर सकते हैं? – Epitaph

+0

@neilCoffey अगर कनेक्शन की 'सेवानिवृत्त' पर विचार नहीं किया जाता है; हमें कई कनेक्शन की आवश्यकता क्यों है? एक सिंगल कनेक्शन हर जगह रिट का उपयोग किया जा सकता है; चूंकि स्टेटमेंट ओबीजे हमेशा अलग होते हैं? जब हमें आवेदन में एकाधिक कनेक्शन की आवश्यकता होती है? –

+0

एक एकल कनेक्शन का उपयोग (सैद्धांतिक रूप से) असीमित संख्या में क्वेरी चलाने के लिए किया जाता है जैसा कि आप कहते हैं। लेकिन यह एक समय में केवल एक क्वेरी चला सकता है। एक मामूली जटिल प्रणाली पर, आपको आम तौर पर कई प्रश्नों को एक साथ चलाने की संभावना की अनुमति देने की आवश्यकता होती है। –

8

आपको इसके लिए कनेक्शन पूल का उपयोग करना चाहिए।

इस तरह आप कनेक्शन के लिए पूछ सकते हैं और इसे जारी जब आप इसके साथ खत्म होते हैं और यह पूल पर लौटने

एक और धागा एक नया कनेक्शन चाहता है और है कि एक उपयोग में है, तो हो सकता है, एक नया एक हो सकता है बनाया था। यदि कोई अन्य धागा कनेक्शन का उपयोग नहीं कर रहा है तो इसका पुन: उपयोग किया जा सकता है।

इस तरह आप अपने ऐप को किसी भी तरह से छोड़ सकते हैं (और कनेक्शन को पास नहीं कर रहे हैं) और अभी भी संसाधनों का सही उपयोग करते हैं।

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

हालांकि स्क्रैच से कोड को कोड करना मुश्किल नहीं है।

:)

This google search कैसे एक का उपयोग करने के बारे में अधिक जानकारी प्राप्त करने के लिए आप में मदद मिलेगी।

के माध्यम से हवा में घूमना

+0

यदि कनेक्शन की 'सेवानिवृत्त' पर विचार नहीं किया जाता है; हमें कई कनेक्शन की आवश्यकता क्यों है? एक सिंगल कनेक्शन हर जगह रिट का उपयोग किया जा सकता है; चूंकि स्टेटमेंट ओबीजे हमेशा अलग होते हैं? जब हमें आवेदन में एकाधिक कनेक्शन की आवश्यकता होती है? –

9

आप सिलसिले में पारित या तो या बेहतर अभी तक जकार्ता डाटाबेस कनेक्शन पूलिंग की तरह कुछ का उपयोग कर सकते हैं। http://commons.apache.org/dbcp/

0

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

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

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

3

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

एक और दृष्टिकोण कनेक्शन पूल के लिए है करने के लिए

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

अन्यथा, मैं एक कनेक्शन पूल का उपयोग करने का सुझाव दूंगा।