2009-08-31 9 views
23

मैं जानना चाहता हूं कि मैं ईजेबी 3 बीन से फ़ाइल सिस्टम का उपयोग कैसे कर सकता हूं?ईजेबी 3 से फ़ाइल सिस्टम तक कैसे पहुंचे?

मैंने इस विषय पर इंटरनेट की खोज की और मुझे कोई अच्छा जवाब नहीं मिला।

कुछ java.io/java.nio का उपयोग करने का सुझाव देते हैं भले ही विनिर्देश इस उपयोग को प्रतिबंधित करता है। अधिकांश एप्लिकेशन सर्वर वैसे भी इस एपीआई तक पहुंच की इजाजत देते हैं।

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

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

आप इस समस्या को कैसे हल करेंगे?

+1

आपके पास डेटाबेस में कोई BLOB नहीं है। SQL सर्वर 2008 फ़ाइलस्ट्रीम स्टोरेज का समर्थन करता है जो अनिवार्य रूप से फ़ाइल को डीबी सर्वर पर किसी फ़ोल्डर में डंप करता है लेकिन डेटाबेस के माध्यम से इसे उजागर करता है। http://blogs.msdn.com/rdoherty/archive/2007/10/12/getting-traction-with-sql-server-2008-filestream.aspx – pjp

उत्तर

9

कारण यह है कि आप EJBs में फाइल सिस्टम का उपयोग कर सकते से की अनुमति नहीं कर रहे हैं यदि आप अपने एप्लिकेशन एक (जावा EE) में चलता है पर कोई नियंत्रण नहीं कंटेनर होता है। उदाहरण के लिए, आपका एप्लिकेशन सर्वर के क्लस्टर में चलाया जा सकता है, जिस स्थिति में किसी ऑब्जेक्ट पर किसी ऑब्जेक्ट को किसी ऑब्जेक्ट में सहेजना मामला कम उपयोग होने की संभावना है। (आपके पास निश्चित रूप से नेटवर्क फ़ाइल-सिस्टम हो सकता है, इसलिए प्रतिबंध लागू नहीं हो सकता है)।

एक विकल्प उपयोगJNDI कार्यान्वयन जो अपने कंटेनर के साथ आता है करने के लिए हो सकता है। आप की संभावना कुछ JNDI स्थान पर एक कच्चे byte[] सरणी को बचाने के लिए सक्षम हो जाएगा, ताकि आप हमेशा वस्तु के धारावाहिक रूप नीचे बचत हो सकती है:

ByteArrayOutputStream baos= new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.writeObject(myObj); 

//Now save into JNDI 
new InitialContext().bind("path/to/myobject", baos.toByteArray()); 

यह बाद में देखा जा सकता है और अपने उद्देश्य में फिर से परिवर्तित:

byte[] bs = (byte[]) new InitialContext().lookup("path/to/myobject"); 
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bs)); 
MyObj myObj = (MyObj) ois.readObject(); 

वैकल्पिक रूप से आप एक XML स्ट्रिंग के रूप में अपने उदाहरण सांकेतिक शब्दों में बदलना एक को बचाने कि JNDI में करने के लिए java.beansलगातार एक्सएमएल (यानी XMLDecoder, XMLEncoder) इस्तेमाल कर सकते हैं।

+0

क्या यह ईजेबी से फ़ाइलों को लिखने का अनुशंसित तरीका है? क्या फाइल क्लस्टर में प्रत्येक नोड के लिए उपलब्ध होगी (मुझे लगता है कि वास्तव में जेएनडीआई क्लस्टर हो गया है)? जेएनडीआई को अंतिम पढ़ने (या लिखना) लेनदेन है? –

+0

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

7

यदि आप जानते हैं कि आप कभी भी अपने एप्लिकेशन को क्लस्टर नहीं करेंगे (या आप ड्राइव को नेटवर्क-मैप करने में सक्षम होंगे) तो बस java.io. * का उपयोग करें।

अपने फाइल स्टोरेज के रूट स्थान के बारे में उचित कॉन्फ़िगरेशन पेश करना सुनिश्चित करें।

+0

+1 यह उत्तर सिर्फ * सामान्य ज्ञान * है। अगर फ़ाइल किसी अन्य प्रोग्राम द्वारा भरती है (जो ईजेबी का पालन नहीं करती है) तो ऐसा करने के लिए कोई तेज़ और * स्पष्ट * तरीका नहीं है। – ATorras

+2

जावा ईई स्पेक का पालन नहीं करने वाले एप्लिकेशन को लिखकर, आप यह सुनिश्चित नहीं कर सकते कि यह पोर्टेबल और रखरखाव योग्य है। उदाहरण के लिए, 12 महीने के समय में आपने इस परियोजना को अपने ऐप को क्लस्टर करने के कार्य को देखते हुए गरीब व्यक्ति के लिए एक बड़े आश्चर्य के साथ छोड़ा होगा। या इसे एक अलग कंटेनर में पोर्टिंग। –

+7

* "यदि आप जानते हैं कि आप कभी भी अपने आवेदन को क्लस्टर नहीं करेंगे" * - यदि आपको लगता है कि आप भविष्य में देख सकते हैं, तो आप सोच सकते हैं कि जुआ उद्योग में एक और अधिक आकर्षक करियर है। –

5

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

+0

+1 – flybywire

1

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

आपको Sun Blueprint's FAQ on EJB restrictions में बहुत अधिक जानकारी मिल जाएगी।

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

+0

सिंगलटन/टाइमर के माध्यम से स्थानीय रूप से कैशिंग फ़ाइलों को एक ऑपरेशन का एक और उदाहरण है जो काफी सुरक्षित है। –

+1

"जब तक [...] आपको ईजेबी से फाइल सिस्टम तक पहुंचने का प्रयास नहीं करना चाहिए" - बिल्कुल कोई विशिष्ट कारण नहीं है कि इसे केवल ईजेबी के लिए क्यों रखा जाना चाहिए। * हर प्रकार के बीन * से आईओ करते समय सावधान रहना चाहिए, न केवल बीन्स जो ईजेबी बीन्स होते हैं। –

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