วัตถุประสงค์ของ JNDI คืออะไร


91

คุณจะตระหนักถึงการใช้งาน JNDI พร้อมตัวอย่างได้อย่างไร?


3
คุณสามารถตรวจสอบโพสต์บล็อกส่วนตัวสำหรับกรณีการใช้งาน: tshikatshikaaa.blogspot.com/2013/01/…
Jérôme Verstrynge

@JVerstry +1 เพื่อชี้ไปยังบทความที่พูดถึง LDAP, JCA และ CCI ที่เกี่ยวข้อง
Ajay

คำตอบ:


112

JNDI คือ Java Naming และ Directory Interface โดยจะใช้ในการแยกความกังวลของโปรแกรมนักพัฒนาและการประยุกต์ใช้Deployer เมื่อคุณเขียนแอปพลิเคชันที่อาศัยฐานข้อมูลคุณไม่จำเป็นต้องกังวลเกี่ยวกับชื่อผู้ใช้หรือรหัสผ่านสำหรับการเชื่อมต่อกับฐานข้อมูลนั้น JNDI อนุญาตให้นักพัฒนาตั้งชื่อให้กับฐานข้อมูลและพึ่งพาตัวปรับใช้เพื่อแมปชื่อนั้นกับอินสแตนซ์จริงของฐานข้อมูล

ตัวอย่างเช่นหากคุณกำลังเขียนโค้ดที่รันในคอนเทนเนอร์ Java EE คุณสามารถเขียนสิ่งนี้เพื่อรับแหล่งข้อมูลที่มีชื่อ JNDI "Database":


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 แตกต่างจากการวางชื่อฐานข้อมูลในไฟล์ config xml หรือไฟล์คุณสมบัติแล้วอ่านจากที่นั่นอย่างไร
Ajay

11
ประการแรกคุณต้องเก็บรหัสผ่านเป็นข้อความธรรมดาในไฟล์กำหนดค่าของคุณ ประการที่สองหากคุณมีหลายแอพที่ชี้ไปที่ฐานข้อมูลเดียวกันและมีบางอย่างเกี่ยวกับการเปลี่ยนแปลงการกำหนดค่าฐานข้อมูลคุณต้องอัปเดตการกำหนดค่าในหลาย ๆ ที่
Simon Nickerson

1
แล้ว JNDI ช่วยตรงนี้อย่างไร?
Ajay

1
สิ่งนี้ควรมีทั้งหมดที่คุณจำเป็นต้องรู้เกี่ยวกับ JNDI ไม่ว่าจะในบริบท J2EE หรือบริบท JavaSE javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
Nico

5
@SimonNickerson สวัสดี! ฉันกำลังเรียนรู้เกี่ยวกับ JNDI นี่เป็นคำตอบที่ดี แต่ถ้าคุณสังเกตเห็นคำถาม "คุณจะตระหนักถึงการใช้งาน JNDI ได้อย่างไร?" ก็ดูยังไม่เสร็จ คุณอธิบายการรับรู้จากมุมมองของผู้พัฒนา มุมมองของผู้ใช้งานเป็นอย่างไร?
lxknvlk

31

JNDI เป็นกลไกที่มีประสิทธิภาพมากสำหรับทั้งการจัดระเบียบข้อมูลการกำหนดค่าการค้นพบและรับฟังบริการผ่านการใช้ไฟล์EventContext. ใน JNDI คุณสามารถค้นหาและฟังวัตถุใด ๆ (ไม่ใช่แค่DataSource s) โดยสมมติว่าผู้ให้บริการ JNDI ของคุณรองรับ

แน่นอนปัญหาเดียวคือการมีผู้ให้บริการ JNDI สิ่งที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้คือการม้วนของคุณเองได้ง่ายอย่างน่าประหลาดใจ ท้ายที่สุดคุณสามารถเข้ารหัสอินสแตนซ์ Java ใด ๆเพื่อXMLใช้ JavaBeans XMLEncoderและXMLDecoder: คุณไม่จำเป็นต้องพึ่งพาการทำงานภายในแอปพลิเคชันเซิร์ฟเวอร์!

อะไรคือความแตกต่างระหว่างสิ่งนี้กับไฟล์คอนฟิกูเรชัน? ดีก็สามารถทำความสะอาดมากเพราะทุกการใช้งานของคุณจะได้รับการกำหนดค่าของพวกเขาจากสถานที่เดียวกัน หากพวกเขาต้องการข้อมูลการกำหนดค่าหุ้น (สถานที่เช่นฐานข้อมูล) แล้วนี้สามารถกำหนดครั้งเดียวใน JNDI สมมติว่าคุณย้ายเซิร์ฟเวอร์ฐานข้อมูล: คุณไม่จำเป็นต้องจำไฟล์ config gazillion ที่มีตำแหน่งอยู่ในนั้น คุณไปที่เดียว: JNDI


นี่เป็นการชี้แจงที่กลมที่สุด - ขอบคุณ oxbow_lakes! Btw คุณจะมีตัวชี้รหัสที่มีการเข้ารหัสอินสแตนซ์ Java ตามที่คุณแนะนำหรือไม่?
Rohan Kumar

13

JNDI เป็น API ที่ใช้ในการเข้าถึงไดเร็กทอรีและบริการการตั้งชื่อ (เช่นหมายถึงชื่อที่เชื่อมโยงกับอ็อบเจ็กต์) การเชื่อมโยงของชื่อกับวัตถุเรียกว่าการผูก

ตัวอย่างพื้นฐานของบริการตั้งชื่อคือ DNS ซึ่งแมปชื่อเครื่องกับที่อยู่ IP

การใช้ JNDI แอ็พพลิเคชันสามารถจัดเก็บและดึงอ็อบเจ็กต์ Java ที่มีชื่อประเภทใดก็ได้

ภายในบริบทของ java สิ่งนี้สามารถใช้ในไฟล์กำหนดค่าที่คุณไม่ต้องการตัวแปรเฉพาะสภาพแวดล้อมฮาร์ดโค้ด

ตัวอย่างฤดูใบไม้ผลิ:

ไฟล์บริบท Spring

<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>

ไฟล์บริบท Tomcat

<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 Context Interface (คุณสมบัติเหล่านี้ระบุการตั้งค่าสำหรับการดำเนินการ 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/concepts/c_jndi_JNDI_Service_Providers_.htm

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.