2012-09-22 9 views
9

यदि मुझे DriverManager.getConnection() और DataSource.getConnection() का उपयोग कर कनेक्शन ऑब्जेक्ट मिलता है, तो वे ऑब्जेक्ट्स पर .close() पर कॉल करने पर व्यवहार में भिन्न कैसे होते हैं?कनेक्शन व्यवहार - DriverManager.getConnection() और DataSource.getConnection()

.close() विधि कॉल से पहले, मुझे प्रासंगिक दो 0 अलग-अलग कनेक्शनों से प्रासंगिक Statement और ResultSet ऑब्जेक्ट मिला। इन दो वस्तुओं को प्राप्त करने के तुरंत बाद, यदि मैं connection1.close() (DriverManager.getConnection() के माध्यम से) कहता हूं, तो यह कनेक्शन ऑब्जेक्ट को समाप्त कर देगा और मुझे प्रासंगिक वक्तव्य और परिणामसेट ऑब्जेक्ट तक पहुंचने की अनुमति नहीं है। यदि मैं गलत हूं तो मुझे सही करों?

दूसरा परिदृश्य, अब अगर मैं connection2.close() (DataSource.getConnection() के माध्यम से) कहता हूं, तो यह इसे पूल पर वापस लौटाता है। लेकिन कनेक्शन अभी भी लाइव है। क्या मैं संबंधित Statement और ResultSet ऑब्जेक्ट्स तक पहुंचने में सक्षम हूं?

उत्तर

6

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

अब अगर हम DataSource मानते हैं जो कनेक्शन पूलिंग प्रदान करता है, तो 0Sप्राप्त करने के लिए डेटासोर्स स्वयं ConnectionPoolDataSource (या एक समान आंतरिक तंत्र) का उपयोग करता है। यह PooledConnection डेटाबेस के वास्तविक भौतिक कनेक्शन का प्रबंधन करता है।

जब कोई उपयोगकर्ता डेटासोर्स से कनेक्शन का अनुरोध करता है, तो डेटासोर्स पूल किए गए कनेक्शन को चेकआउट करेगा, और इसे Connection के लिए पूछेगा। PooledConnection तब एक लॉजिकल कनेक्शन बनाएगा जो भौतिक कनेक्शन का उपयोग करता है या लपेटता है (उदाहरण के लिए प्रॉक्सी का उपयोग करना)। डेटासोर्स उपयोगकर्ता को उस लॉजिकल कनेक्शन को वापस कर देगा।

उपयोगकर्ता को तार्किक कनेक्शन सभी पहलुओं में भौतिक कनेक्शन के समान व्यवहार करना चाहिए। तो जब कोई उपयोगकर्ता कनेक्शन बंद कर देता है, तो वह तार्किक कनेक्शन और सभी आश्रित जेडीबीसी ऑब्जेक्ट बंद हो जाएंगे और भौतिक कनेक्शन के करीब व्यवहार करेंगे।

JDBC 4.1 खंड 11.1 का कहना है:

कनेक्शन पूलिंग पूरी तरह से ग्राहक के लिए पारदर्शी है: एक ग्राहक एक जमा कनेक्शन प्राप्त और यह सिर्फ एक ही तरह से यह प्राप्त उपयोग करता है और एक गैर pooled कनेक्शन का उपयोग करता है।

और खंड 11.4:

आवेदन तार्किक संभाल का पुन: उपयोग करने का प्रयास है, तो कनेक्शन कार्यान्वयन एक SQLException फेंकता है।

और

एक दिया PooledConnection वस्तु के लिए, केवल सबसे हाल ही में उत्पादित तार्किक कनेक्शन वस्तु मान्य होगा। संबंधित PooledConnection.getConnection विधि को कॉल किए जाने पर पहले से मौजूद किसी मौजूदा कनेक्शन ऑब्जेक्ट को स्वचालित रूप से बंद कर दिया जाता है।

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

डेटासॉर्स लॉजिकल कनेक्शन को बंद करने के लिए PooledConnection से पूछकर, उपयोगकर्ता से एक कनेक्शन को मजबूती से निरस्त कर सकता है (उदाहरण के लिए जब कनेक्शन बहुत लंबे समय तक चेक किया जाता है)।

+0

मेरे आवेदन में, मैं अपनी 'कनेक्शन' ऑब्जेक्ट को बंद करने के बाद भी अपने 'परिणामसेट' ऑब्जेक्ट तक पहुंचने में सक्षम हूं। तो आपके अनुसार, वेबस्फीयर इस कार्यान्वयन में विफल रहा है? – Sriram

+0

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

+1

और यदि यह वेबस्पेयर का गलत कार्यान्वयन है: यह उस वेबपृष्ठ के 'डेटासोर्स' के लिए 'कनेक्शन पुलडेटा स्रोत' के रूप में उपयोग करने पर निर्भर करता है। वर्णित व्यवहार को 'पूलड कनेक्शन' कार्यान्वयन द्वारा लागू किया जाना चाहिए। –

3

connection1.close() (DriverManager.getConnection के माध्यम से()),

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

connection2.close() (DataSource.getConnection माध्यम से())

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

तुम सच के बाद Statement और Connection को बंद कर दिया डेटा ResultSet में आयोजित उपलब्ध करना चाहते हैं, तो आप CachedRowSet पर एक नज़र ले जा सकते हैं कि यदि आपके USECASE फिट बैठता है।

+2

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

3

क्लाइंट-साइड कैशिंग निश्चित रूप से कनेक्शन के लिए इस्तेमाल होने वाले ड्राइवर पर निर्भर हो सकता है। लेकिन कुछ ड्राइवर विशेष रूप से कनेक्शन बंद होने के बाद आपको एक कथन या परिणाम का उपयोग करने से रोकते हैं। अन्य क्लाइंट साइड

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