2011-05-23 19 views
7

मेरे पास कनेक्शन पूलिंग के साथ तैयार वक्तव्य के सामान्य उपयोग के संबंध में एक प्रश्न है।कनेक्शन पूलिंग के साथ तैयार वक्तव्य

तैयार किए गए वक्तव्य आम तौर पर केवल एक कनेक्शन से बंधे होते हैं। हमारे आवेदन में, प्रारंभिक समय पर तैयार तैयार किया जाता है और बाद में निष्पादित किया जाता है।

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

अद्यतन

मैं सो() अपाचे डर्बी डेटाबेस जो वर्ग TimeHandlingTest में जावा समारोह नींद कॉल के साथ समारोह का पालन करके इस परीक्षण किया है।

फ़ंक्शन स्लीप बनाएं() एंटरटेनमेंट भाषा जावा जावा पैरामीटर स्टाइल जावा कोई SQL बाहरी नाम 'com.derby.test.TimeHandlingTest.sleep';

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

+0

क्या आपका कोड एप्लिकेशन सर्वर में चल रहा है? जब आप कनेक्शन प्राप्त करने के लिए DriverManager के विरोध में डेटासोर्स का उपयोग करते हैं तो इसका जवाब बदलता रहता है। –

+0

@ विनीत: हमारा एप्लिकेशन एक साधारण जावा एप्लिकेशन है जो एप्लिकेशन सर्वर पर नहीं चल रहा है। हम ड्राइवर प्रबंधक से कनेक्शन प्राप्त कर रहे हैं। –

उत्तर

8

यदि आप PreparedStatement का उपयोग करने की योजना बना रहे हैं तो आप पूल में Connection वापस नहीं कर सकते हैं।

दूसरे शब्दों में: आप वर्तमान में Connection से निर्मित PreparedStatement का उपयोग कर सकते हैं।

+0

यह एक उचित समाधान प्रतीत नहीं होता है क्योंकि मेरे आवेदन के लिए तैयार कथन के रूप में कनेक्शन के रूप में आवश्यकता होगी। –

+1

यह एक समाधान नहीं है, यह एक आवश्यकता है! यदि आप इसका पालन नहीं करते हैं, तो आप जल्दी या बाद में परेशानी में भाग लेंगे। –

1

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

4

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

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES 
           SET SALARY = ? WHERE ID = ?"); 
pstmt.setBigDecimal(1, 153833.00); 
pstmt.setInt(2, 110592); 

दूसरी ओर आप स्ट्रिंग संयोजन का प्रयोग करेंगे तो SQL कोड में पैरामीटर मान चिपकाने के लिए, डेटाबेस एक सामान्य निष्पादन योजना का निर्माण करने में सक्षम नहीं होगा। इस प्रकार यह अगर आप कोई अंतर नहीं होगा एक तैयार स्टेटमेंट या स्टेटमेंट का उपयोग करें, उदाहरण के लिए

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES 
           SET SALARY = 1200 WHERE ID = 3"); 

तैयार किए गए चरणों का लाभ उपयोग करने में सक्षम नहीं होगा।

आपके प्रश्न का तात्पर्य है कि आप तैयार किए गए स्टेटमेंट ऑब्जेक्ट का पुन: उपयोग करना चाहते हैं, जो आवश्यक नहीं है। बेशक यदि आप एकाधिक मानों को अपडेट करने के लिए प्रीपेयरस्टेटमेंट ऑब्जेक्ट का उपयोग कर सकते हैं तो यह ressources का एक अधिक कुशल उपयोग है। फिर भी तैयार किए गए स्तर का जीवनकाल (या कम से कम उपयोगी जीवनकाल) कनेक्शन से जुड़ा हुआ है, इस प्रकार यदि आप conn.close() को कॉल करते हैं तो तैयार किए गए स्टेटमेंट को बेकार किया जाता है। फिर भी एक पूलिंग स्थिति में सबसे अच्छे ड्राइवर एक ही प्रीपेरस्टेटमेंट ऑब्जेक्ट्स का पुन: उपयोग करते हैं। संक्षेप में, कनेक्शन से स्वतंत्र तैयार स्टेशन को कैश न करें।

+0

उत्तर के लिए धन्यवाद लेकिन मेरा मुख्य सवाल यह है कि यदि मेरे तैयार कथन से जुड़े कनेक्शन किसी भी अन्य तैयार कथन को चलाने में व्यस्त हैं कि मेरा तैयार कथन कैसे चलाएगा। क्या हम कई तैयार वक्तव्य चला सकते हैं, एक समय में एक कनेक्शन होगा? \ –

0

इसके चारों ओर एक तरीका कैश को बनाए रखना है जहां कनेक्शन तैयार कथन में मैप किए जाते हैं। जब आप पूल से कनेक्शन प्राप्त करते हैं तो जांच करें कि इसे तैयार किए गए कथन पर मैप किया गया है या नहीं। यदि नहीं, तो जेडीबीसी चालक को तैयार कथन पास करें ताकि इसे संकलित किया जा सके। फिर इसे कनेक्शन में मैप करें। इस दृष्टिकोण का नकारात्मक पक्ष यह है कि एक से अधिक कनेक्शन एक ही तैयार कथन की प्रतियां प्राप्त कर सकते हैं। लेकिन ऐसा लगता है कि this is what some J2EE servers do

2

मान लीजिए कि यह एक बहु थ्रेडेड एप्लिकेशन है, Connection ऑब्जेक्ट आमतौर पर किसी भी समय किसी भी थ्रेड से जुड़े होते हैं। Connection थ्रेड द्वारा अधिग्रहित वस्तुओं को पूल तक वापस नहीं लौटाया जाता है जब तक वे बंद नहीं होते हैं। यह लॉजिकल कनेक्शन रैपर (जिसे आमतौर पर एप्लिकेशन सर्वर द्वारा प्रबंधित डेटासोर्स द्वारा लौटाया जाता है) पर लागू होता है, साथ ही भौतिक कनेक्शन के लिए भी। साथ ही, भौतिक कनेक्शन को कई लॉजिकल कनेक्शनों में साझा किया जा सकता है जब तक वे एक ही लेनदेन का हिस्सा हों।

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

+0

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

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