JNDI का उद्देश्य क्या है


90

यदि संभव हो तो उदाहरण के साथ, आप जेएनडीआई के उपयोग को कैसे महसूस कर सकते हैं?


3
आप उपयोग के मामलों के लिए एक व्यक्तिगत ब्लॉग पोस्ट देख सकते हैं: tshikatshikaaa.blogspot.com/2013/01/…
Jérôme Verstrynge

@JVerstry +1 संबंधित LDAP, JCA और CCI के बारे में बात करने वाले लेख की ओर इशारा करता है।
अजय

जवाबों:


109

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

उदाहरण के लिए, यदि आप एक जावा ईई कंटेनर में चलने वाले कोड लिख रहे हैं, तो आप इसे JNDI नाम "डेटाबेस" के साथ डेटा स्रोत को पकड़ने के लिए लिख सकते हैं:


DataSource dataSource = null;
try
{
    Context context = new InitialContext();
    dataSource = (DataSource) context.lookup("Database");
}
catch (NamingException e)
{
    // Couldn't find the data source: give up
}

नोट डेटाबेस चालक, या उपयोगकर्ता नाम, या पासवर्ड के बारे में यहाँ कुछ भी नहीं है। यह कंटेनर के अंदर कॉन्फ़िगर किया गया है।

JNDI डेटाबेस (JDBC) तक सीमित नहीं है; सभी प्रकार की सेवाओं को नाम दिया जा सकता है। अधिक जानकारी के लिए, आपको ओरेकल के ट्यूटोरियल की जांच करनी चाहिए ।


10
तो इस उदाहरण के साथ चित्र में, JNDI डेटाबेस नामों को एक कॉन्फिगरेशन xml फ़ाइल या प्रॉपर्टी फ़ाइल में रखने से अलग कैसे है और फिर इसे वहां से पढ़ रहे हैं?
अजय

11
सबसे पहले, आपको अपनी पाठ फ़ाइल में सादा पाठ में पासवर्ड संग्रहीत करना होगा। दूसरे, यदि आपके पास एक ही डेटाबेस की ओर इशारा करने वाले कई ऐप हैं और डेटाबेस कॉन्फिगर में बदलाव के बारे में कुछ है, तो आपको कई जगहों पर कॉन्फिगरेशन को अपडेट करना होगा।
साइमन निकर्सन

1
अच्छा, JNDI यहाँ कैसे मदद करता है?
अजय

1
इसमें JNDI के बारे में आप सभी को पता होना चाहिए, चाहे वह J2EE के संदर्भ में हो या JavaSE के संदर्भ में। javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
निको

5
@SimonNickerson हाय !. मैं जेएनडीआई के बारे में सीख रहा हूं। यह एक अच्छा उत्तर है, लेकिन यदि आप इस प्रश्न पर ध्यान दें कि "आप JNDI के उपयोग का एहसास कैसे कर सकते हैं?" तब यह अधूरा लगता है। आपने डेवलपर के दृष्टिकोण से अहसास का वर्णन किया। कैसे के बारे में है?
lxknvlk

30

JNDI कॉन्फ़िगरेशन जानकारी को व्यवस्थित करने और सेवाओं के उपयोग के माध्यम से सेवाओं को खोजने और सुनने के लिए एक बहुत ही शक्तिशाली तंत्र है EventContext। JNDI में आप किसी भी ऑब्जेक्ट को देख सकते हैं और सुन सकते हैं (सिर्फ DataSources नहीं ), यह मानते हुए कि आपका JNDI सेवा प्रदाता इसका समर्थन करता है।

बेशक, एकमात्र मुद्दा वास्तव में जेएनडीआई सेवा प्रदाता है; इसके बारे में महान बात यह है कि यह आश्चर्यजनक रूप से अपने स्वयं के रोल करना आसान है। सब के बाद आप किसी भी जावा उदाहरण को XMLJavaBeans का उपयोग करके सांकेतिक शब्दों में बदलना कर सकते हैं : XMLEncoderऔर XMLDecoderआपको एक एप्लिकेशन सर्वर के भीतर चलने पर भरोसा करने की आवश्यकता नहीं है!

तो इस विन्यास फाइल होने में क्या अंतर है? ठीक है, यह बहुत साफ हो सकता है क्योंकि आपके सभी एप्लिकेशन एक ही स्थान से अपना कॉन्फ़िगरेशन प्राप्त कर सकते हैं । यदि उन्हें कॉन्फ़िगरेशन जानकारी (जैसे डेटाबेस स्थान) साझा करने की आवश्यकता है, तो इसे जेएनडीआई में एक बार परिभाषित किया जा सकता है । मान लीजिए कि आप डेटाबेस सर्वर को स्थानांतरित कर चुके हैं: आपको उस स्थान के साथ gazillion config फ़ाइलों को याद रखने की आवश्यकता नहीं है। आप सिर्फ एक ही स्थान पर जाएं: जेएनडीआई।


यह अब तक सबसे अधिक स्पष्ट स्पष्टीकरण है - धन्यवाद oxbow_lakes! Btw, क्या आपके पास कोड पॉइंटर्स होंगे जहां कोई जावा उदाहरण आपके सुझाव के अनुसार एन्कोड किया गया है?
रोहन कुमार

13

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

नामकरण सेवा का एक मूल उदाहरण DNS है जो आईपी पते के लिए मशीन के नाम को मैप करता है।

JNDI का उपयोग करते हुए, अनुप्रयोग किसी भी प्रकार की जावा वस्तुओं को नामित और संग्रहीत कर सकते हैं।

जावा के संदर्भ में इसका उपयोग कॉन्फ़िगरेशन फ़ाइलों में किया जा सकता है जहां आप हार्ड-कोड वातावरण विशिष्ट चर नहीं चाहते हैं।

वसंत उदाहरण:

स्प्रिंग संदर्भ फ़ाइल

<bean id="WSClientConfig" class="com.example.BaseClientConfigImpl">
<property name="protocol">
    <jee:jndi-lookup jndi-name="java:comp/env/protocol" />
</property>
<property name="endpoint">
    <jee:jndi-lookup jndi-name="java:comp/env/endpoint" />
</property>
<property name="requestPath">
<jee:jndi-lookup jndi-name="java:comp/env/requestPath" />    
</property>

टॉमकैट संदर्भ फ़ाइल

<Environment name="protocol" type="java.lang.String" value="https://"/>
<Environment name="endpoint" type="java.lang.String" value="172.0.0.1"/>
<Environment name="requestPath" type="java.lang.String" value="/path/to/service"/>

3

JNDI एक संसाधन निर्माण के सरलीकरण की अनुमति देता है सिर्फ एक नाम में । तो, यह सुविधा / सुरक्षा / आदि के लिए 1 में कई विवरण समूह है । (उर्फ अमूर्त परत)

एहसास करने के लिए: एक संपत्ति सूची स्थापित करें जो कि जेन्डी संदर्भ इंटरफ़ेस में पूर्वनिर्धारित क्षेत्रों से मेल खाती है। (ये गुण jndi निष्पादन के लिए सेटिंग्स निर्दिष्ट करते हैं; लेकिन * खोज नाम नहीं)

Properties props = new Properties();
//field Context.INITIAL_CONTEXT_FACTORY => property name java.naming.factory.initial
    //field Context.PROVIDER_URL => property name java.naming.provider.url
props.load(new FileInputStream("*properties file*")); //prop file in this case

Context ctx = new InitialContext(props);
    Object o = ctx.lookup("*name of resource*");

आदर्श रूप से, आपके संगठन में LDAP निर्देशिका, DNS इत्यादि को बनाए रखने के लिए एक विशेष फ़ंक्शन मौजूद होगा (इसलिए एकीकृत एकल मैपिंग सेट सेवाएँ सभी, विसंगतियों को कम करती हैं)

JNDI सेवा प्रदाताओं की सूची: https://www.ibm.com/support/knowledgecenter/en/SSVSD8_8.4.1/com.ibm.websphere.dtx.adapjndi.doc/conpret-c_jndi_JNDI_Service_Providers_.htm

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.