2016-08-18 13 views
8

मैं एक ऐसा एप्लिकेशन चला रहा हूं जो टॉमकैट 8 सर्वर से हाइबरनेट का उपयोग करता है। मैं हाइबरनेट के अलावा एक अलग कनेक्शन पूल का उपयोग करना चाहता हूं क्योंकि वे इसे स्पष्ट रूप से स्पष्ट करते हैं कि यह उत्पादन वातावरण में उपयोग के लिए उपयुक्त नहीं है।एक ही समय में सी 3 पीओ और जेएनडीआई का उपयोग क्यों करते हैं?

इसके अलावा, वे उल्लेख है कि:

एक आवेदन सर्वर के अंदर उपयोग के लिए, आप लगभग हमेशा हाइबरनेट एक आवेदन सर्वर JNDI में पंजीकृत javax.sql.Datasource से कनेक्शन प्राप्त करने के लिए कॉन्फ़िगर करना चाहिए।

तो ऐसा लगता है मैं दो काम करने की जरूरत है:

  1. कॉन्फ़िगर हाइबरनेट एक कनेक्शन पूल तीसरे पक्ष के साथ काम करने के - हाइबरनेट C3PO
  2. कॉन्फ़िगर हाइबरनेट की सिफारिश की एक javax.sql.Datasource वस्तु से कनेक्शन प्राप्त करने के लिए जेएनडीआई

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

हाँ सही है, मैं सी 3 पी 0 और जेएनडीआई दोनों का उपयोग करके वास्तव में मूर्खतापूर्ण कर रहा हूं। मैंने सभी c3p0 विन्यास को हटा दिया और यह अभी ठीक काम कर रहा है।

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

तो क्या मैं एक ही समय में दोनों का उपयोग नहीं कर सकता, या क्या मुझे, जैसा कि हाइबरनेट की सिफारिश की जाती है? मैं बस इतना करना चाहता हूं कि हाइबरनेट के डिफ़ॉल्ट कनेक्शन पूल को एक पूल के साथ प्रतिस्थापित करना है जो कि उत्पादन वातावरण में उपयोग के लिए है, और जेएनडीआई में पंजीकृत javax.sql.Datasource ऑब्जेक्ट से कनेक्शन प्राप्त करने के लिए हाइबरनेट को कॉन्फ़िगर भी करें, जैसा कि वे अनुशंसा करते हैं।

उत्तर

2

मैं भ्रम को साफ करने की कोशिश करूंगा।

मुझे लगता है कि यह आश्चर्यजनक रूप से सरल डेटास्रोत इंटरफेस के साथ शुरू होता है: https://docs.oracle.com/javase/7/docs/api/javax/sql/DataSource.html

डेटास्रोत इंटरफ़ेस एक चालक विक्रेता द्वारा कार्यान्वित किया जाता है। वहाँ कार्यान्वयन की तीन प्रकार हैं: - एक मानक कनेक्शन वस्तु

  • कनेक्शन पूलिंग कार्यान्वयन का उत्पादन -

    1. बेसिक कार्यान्वयन एक कनेक्शन उद्देश्य यह है कि स्वचालित रूप से कनेक्शन पूलिंग में भाग लेंगे पैदा करता है। यह कार्यान्वयन एक मध्यम-स्तरीय कनेक्शन पूलिंग प्रबंधक के साथ काम करता है।
    2. वितरित लेनदेन कार्यान्वयन - एक कनेक्शन ऑब्जेक्ट उत्पन्न करता है जिसका उपयोग वितरित लेनदेन के लिए किया जा सकता है और लगभग हमेशा कनेक्शन पूलिंग में भाग लेता है। यह कार्यान्वयन मध्य-स्तरीय लेनदेन प्रबंधक के साथ काम करता है और लगभग हमेशा कनेक्शन पूलिंग प्रबंधक के साथ काम करता है।
  • हाइबरनेट के साथ काम करने के लिए एक डेटा स्रोत की जरूरत है, और सिफारिश की है कि यह कनेक्शन पूलिंग का उपयोग करता है।

    सी 3 पीओ एक मौजूदा डेटासोर्स को लपेटता है और इसमें कनेक्शन पूलिंग लागू करता है, और एक नया डेटासोर्स बनाता है जो टाइप 2 है। सी 3 पीओ मानता है कि डेटासोर्स इसे प्राप्त करता है टाइप 1 है, लेकिन यह सुनिश्चित नहीं हो सकता है।

    अन्य एप्लिकेशन सर्वरों में, यदि आप जेएनडीआई में पंजीकृत डेटासोर्स घोषित करते हैं, तो यह लगभग हमेशा कंटेनर में कनेक्शन पूलिंग का उपयोग करता है। टॉमकैट 8 के मामले में, यह आंतरिक रूप से सी 3 पीओ का उपयोग करता है।

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

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

    कॉन्फ़िगरेशन के आधार पर, अंतर्निहित कनेक्शन पूल संभवतः एक निश्चित टाइमआउट के बाद कनेक्शन को मार सकता है।

    तो एक दूसरे के शीर्ष पर दो कनेक्शन पूल कॉन्फ़िगर करना खतरनाक और पूरी तरह से अनावश्यक है।

    बाउंटी प्रश्न का उत्तर देने के लिए: उत्पादन वातावरण में, अपने उत्पादन कंटेनर में डेटासोर्स घोषित करें और इसे Hibernate में कॉन्फ़िगर किए गए अतिरिक्त कनेक्शन पूलिंग के बिना जेएनडीआई के माध्यम से हाइबरनेट से कनेक्ट करें।

    1

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

    • कंटेनर करता है अपने स्टार्टअप आपरेशन
      • कनेक्शन बनाएँ और कनेक्शन डेटासंग्रह की, मेल सत्र की तरह
      • बनाएँ और कॉन्फ़िगर JNDI संसाधनों के लिए सुनना प्रारंभ:

        यहाँ आवेदन स्टार्टअप के एक सरल रूपरेखा है , आदि

    • वेब अनुप्रयोगों को तैनात करें 01 एक वेब अनुप्रयोग
    • कॉन्फ़िगर वेब अनुप्रयोग
    • किसी भी JNDI संसाधनों विन्यास
    • समाप्त तैनाती के दौरान निर्दिष्ट प्रदान के लिए
      • स्कैन

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

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