2009-03-25 16 views
5

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

मैं हाइबरनेट (com.springsource.org.hibernate-3.2.6.ga.jar) के "ओजीआई-बंडल" संस्करण का उपयोग कर रहा हूं। जहां तक ​​मुझे पता है कि यह मेटा-आईएनएफ/MANIFEST.mf में स्थापित कुछ अतिरिक्त ओजीआई-मेटाडेटा के साथ हाइबरनेट कोर है। ओएसजीआई सिस्टम के लिए यह जानकारी (पैकेज-निर्यात और पैकेज-आयात) महत्वपूर्ण है।

मेरी समस्या यह है कि हाइबरनेट बंडल मेरे जेडीबीसी-ड्राइवर नहीं ढूंढ सकता है। स्प्रिंग्ससोर्स हाइबरनेट बंडल में आयात विवरण जोड़ने में बहुत गलत लगता है। इसे हल करने के लिए कुछ बेहतर तरीका होना चाहिए।

उत्तर

1

मुझे कुछ समय पहले similar problem का सामना करना पड़ा। समाधान जेडीबीसी-प्रदाता बंडल और जेडीबीसी-उपयोगकर्ता बंडलों को "दोस्त" के रूप में पंजीकृत करना था। ऐसा इसलिए है क्योंकि एक बंडल कक्षाओं (इसलिए jdbc ड्राइवर भी) का उपयोग स्पष्ट रूप से घोषित किए बिना किसी अन्य से नहीं कर सकता है। यह ग्रहण के लिए था, इसलिए मुझे लगता है कि यह आपकी मदद कर सकता है।

3

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

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

एक और समस्या यह हो सकती है कि आपके पास कुछ अनसुलझे निर्भरताएं हों। सुनिश्चित करें कि सब कुछ है। आप ओएसजीआई कंसोल प्राप्त करके और सेवाओं की एक सूची मांगकर ऐसा कर सकते हैं। विषुव में यह ओएसजीआई शेल में "कंसोल कमांडलाइन तर्क और" एसएस "के बाद" डायग "कमांड के बाद उबाल जाता है।

संपादित करें (अपनी टिप्पणी का जवाब):

चालक अपनी इंटरफ़ेस द्वारा registerd कर रहे हैं। इसके बाद हाइबरनेट शायद अपने इंटरफ़ेस द्वारा ड्राइवर को देखता है, विशिष्ट ड्राइवर वर्गों को आयात करने की आवश्यकता नहीं होती है। यह वैसे भी एक कार्यान्वयन विशिष्ट वर्ग पर एक अवांछित निर्भरता पेश करेगा।

+0

लेकिन मैं नहीं कर सकते कि कैसे हाइबरनेट बंडल कभी स्पष्ट रूप से बिना सही JDBC-चालक मिलेगा देखना आयात करना उदाहरण के लिए। org.embedded.derby या org.mysql.jdbc .. –

+0

क्या आपके पास अपने हाइबरनेट बंडल के स्रोत हैं? मैनिफेस्ट पर एक नज़र डालें और देखें कि एक्टिवेटर क्लास कौन सा है। फिर इस वर्ग को देखें और यह शायद आपके प्रश्न का उत्तर देगा – paweloque

+0

"हाइबरनेट तो शायद इसके इंटरफ़ेस द्वारा ड्राइवर को देखता है, विशिष्ट ड्राइवर वर्गों को आयात करने की आवश्यकता नहीं है"। क्या इसका मतलब यह है कि हाइबरनेट बंडल में एक विशिष्ट जेडीबीसी-ड्राइवर स्थापित करने के लिए कुछ एपीआई है? (उदाहरण के लिए, mysql-jdbc सेट करें, सेट ऑरैक-जेडीबीसी इत्यादि। अन्यथा मैं नहीं देख सकता कि कैसे हाइबरनेट सही ड्राइवर प्राप्त करता है) –

7

हाइबरनेट एक बहुत अच्छा ओएसजीआई नागरिक नहीं है क्योंकि कई धारणाएं हाइबरनेट कक्षा दृश्यता पर बनाता है ओएसजीआई कंटेनर में अब सत्य नहीं है।

Class.forName(<jdbc class name>) के साथ जेडीबीसी ड्राइवरों को लोड करने का सामान्य तरीका ओएसजीआई के अंदर काम नहीं करता है, इस मामले में, हाइबरनेट ड्राइवर को आजमाएगा और लोड करेगा लेकिन इसे नहीं मिलेगा क्योंकि हाइबरनेट (और नहीं होना चाहिए) जेडीबीसी ड्राइवर पैकेज आयात करें।

जेडीबीसी चालक प्रबंधक यह भी काम करके स्मार्ट होने का प्रयास करता है कि कॉलिंग क्लास के क्लास लोडर को ड्राइवर को देखना चाहिए और यह ओएसजीआई के साथ भी संघर्ष करता है।

आप स्प्रिंग हाइबरनेट कॉन्फ़िगर करने के लिए उपयोग करते हैं तो मैं तुम्हें SimpleDriverDataSource वर्ग के रूप में इस OSGi में काम करता है का उपयोग करने का सुझाव और स्प्रिंग आप बल्कि एक वर्ग के नाम हाइबरनेट का दृष्टांत करने की जरूरत है कि गुजर की तुलना में एक ठोस डेटा स्रोत के साथ हाइबरनेट कॉन्फ़िगर करने के लिए अनुमति देता है।

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

फिलहाल, जब तक आप स्प्रिंग के डीएम सर्वर की तरह कुछ उपयोग नहीं करते हैं, आपको जावा के क्लास लोडिंग तंत्र से अधिक परिचित होना होगा और आप वेनिला जावा और ओएसजीआई के बीच असंगतताओं के आसपास काम करने के लिए सेवाओं के लिए ओएसजीआई के दृष्टिकोण का उपयोग कैसे कर सकते हैं विश्व।

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

3

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

हम विषुव की दोस्त नीति का उपयोग कर समस्या के आसपास आते हैं ताकि डोमेन ऑब्जेक्ट्स की आपूर्ति करने वाले प्रत्येक बंडल हाइबरनेट के क्लास-लोडिंग दोस्त हैं। मुझे इस दृष्टिकोण को बहुत पसंद नहीं है, लेकिन मेरे पास मेरे सिर में (आशावादी) सुरुचिपूर्ण समाधान लिखने का समय नहीं है।

जैसा कि मैंने अपनी पिछली पोस्ट में कहा था, संदर्भ वर्ग लोडर में हेरफेर करना शायद हाइबरनेट की बात होने पर सबसे अच्छा दीर्घकालिक शर्त है।

1

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

एक टुकड़ा बनाएं जिसमें आपके डोमेन कक्षाएं हों और होस्ट के रूप में हाइबरनेट बंडल निर्दिष्ट करें। इस टुकड़े को आपके डोमेन वर्गों के पैकेज निर्यात करना चाहिए।

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

मुझे लगता है टुकड़े 9 महीने पहले फेलिक्स पूर्ण में समर्थित नहीं थे, लेकिन वे निश्चित रूप से अब कर रहे हैं ऐसा लगता है: http://osgithoughts.blogspot.com/2009/09/felix-now-fully-supports-osgi-fragments.html

+0

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

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