JNDI คืออะไร การใช้งานพื้นฐานคืออะไร? จะใช้เมื่อไหร่?


คำตอบ:


242

JNDI คืออะไร

มันย่อมาจากJava การตั้งชื่อและไดเรกทอรีอินเตอร์เฟซ

การใช้งานพื้นฐานคืออะไร?

JNDI อนุญาตให้แอปพลิเคชันแบบกระจายค้นหาบริการในลักษณะที่เป็นนามธรรมและไม่ขึ้นกับทรัพยากร

เมื่อมีการใช้งาน?

กรณีการใช้งานบ่อยที่สุดคือการตั้งค่าพูลการเชื่อมต่อฐานข้อมูลบนแอ็พพลิเคชันเซิร์ฟเวอร์ Java EE แอปพลิเคชันใด ๆ ที่ปรับใช้บนเซิร์ฟเวอร์นั้นสามารถเข้าถึงการเชื่อมต่อที่ต้องการโดยใช้ชื่อ JNDI java:comp/env/FooBarPoolโดยไม่ต้องทราบรายละเอียดเกี่ยวกับการเชื่อมต่อ

นี่มีข้อดีหลายประการ:

  1. หากคุณมีลำดับการปรับใช้ที่แอพย้ายจากdevl->int->test->prodสภาพแวดล้อมคุณสามารถใช้ชื่อ JNDI เดียวกันในแต่ละสภาพแวดล้อมและซ่อนฐานข้อมูลจริงที่ใช้ แอปพลิเคชั่นไม่จำเป็นต้องเปลี่ยนเมื่อพวกเขาย้ายระหว่างสภาพแวดล้อม
  2. คุณสามารถลดจำนวนคนที่จำเป็นต้องรู้ข้อมูลประจำตัวสำหรับการเข้าถึงฐานข้อมูลการผลิต เซิร์ฟเวอร์แอป Java EE เท่านั้นที่จำเป็นต้องรู้ถ้าคุณใช้ JNDI

9
ดังนั้นนี่เป็นทางเลือกที่ปลอดภัยกว่าในการมีไฟล์คุณสมบัติพร้อมกับข้อมูลการเชื่อมต่อ jdbc ของคุณ?
กรินช์

4
@grinch: ใช่เป็นหลัก มันปลอดภัยและเป็นมาตรฐานมากขึ้นทำให้การปรับใช้ง่ายขึ้น (ไม่จำเป็นต้องเดาชื่อไฟล์คุณสมบัติที่ต้องเป็นอื่น ๆ )
sleske

อะไรคือความแตกต่างระหว่างการใช้ตัวแปรสภาพแวดล้อมกับ JNDI มันเป็นแนวคิดที่คล้ายกัน?
skryvets

101

JNDI คืออะไร

Java Naming และ Directory Interface TM (JNDI) เป็น application programming interface (API) ที่จัดเตรียมฟังก์ชันการตั้งชื่อและไดเร็กทอรีให้กับแอ็พพลิเคชันที่เขียนโดยใช้ภาษาการเขียนโปรแกรมJava TM มันถูกกำหนดให้เป็นอิสระจากการดำเนินการบริการไดเรกทอรีที่เฉพาะเจาะจง ดังนั้นความหลากหลายของไดเรกทอรี (ใหม่เกิดขึ้นใหม่และปรับใช้แล้ว) สามารถเข้าถึงได้ในลักษณะทั่วไป

การใช้งานพื้นฐานคืออะไร?

ส่วนใหญ่ครอบคลุมในคำตอบข้างต้น แต่ฉันต้องการให้สถาปัตยกรรมที่นี่เพื่อให้ด้านบนจะทำให้รู้สึกมากขึ้น

ป้อนคำอธิบายรูปภาพที่นี่

ในการใช้ JNDI คุณต้องมีคลาส JNDI และผู้ให้บริการอย่างน้อยหนึ่งราย Java 2 SDK, v1.3 มีผู้ให้บริการสามรายสำหรับบริการการตั้งชื่อ / ไดเรกทอรีต่อไปนี้:

  1. โพรโทคอลการเข้าถึงไดเรกทอรี Lightweight (LDAP)
  2. สถาปัตยกรรมโบรคเกอร์นายหน้าวัตถุทั่วไป (CORBA) บริการชื่อสามัญ Object Services (COS)
  3. การลงทะเบียน Java Remote Method การขอร้อง (RMI)

ดังนั้นโดยทั่วไปคุณสร้างวัตถุและลงทะเบียนในบริการไดเรกทอรีซึ่งคุณสามารถทำการค้นหาและดำเนินการในภายหลัง


30

JNDI ในแง่ของคนธรรมดานั้นเป็นอินเตอร์เฟสสำหรับการรับอินสแตนซ์ของทรัพยากรภายใน / ภายนอกเช่น

  javax.sql.DataSource, 
  javax.jms.Connection-Factory,
  javax.jms.QueueConnectionFactory,
  javax.jms.TopicConnectionFactory,
  javax.mail.Session, java.net.URL,
  javax.resource.cci.ConnectionFactory,

หรือชนิดอื่นใดที่กำหนดโดยอะแดปเตอร์ทรัพยากร JCA มันมีไวยากรณ์ในความสามารถในการสร้างการเข้าถึงไม่ว่าจะเป็นภายในหรือภายนอก ie (comp / env ในอินสแตนซ์นี้หมายถึงตำแหน่งที่องค์ประกอบ / สภาพแวดล้อมมีไวยากรณ์อื่น ๆ อีกมากมาย):

jndiContext.lookup("java:comp/env/persistence/customerDB");

1
นี่เป็นเพียงส่วนหนึ่งของภาพ JNDI ช่วยให้คุณสามารถค้นหาวัตถุ Java - พวกเขาสามารถเป็นทรัพยากรเช่นแหล่งข้อมูลหรืออย่างอื่นแม้กระทั่งธรรมดาjava.lang.Stringสำหรับข้อมูลการกำหนดค่า
sleske

3
@sleske ฉันขอแนะนำให้คุณตอบเอง
Ced

14

ภาพรวม JNDI

JNDI เป็น API ที่ระบุในเทคโนโลยี Java ที่ให้ฟังก์ชันการตั้งชื่อและไดเรกทอรีไปยังแอปพลิเคชันที่เขียนด้วยภาษาการเขียนโปรแกรม Java มันถูกออกแบบมาโดยเฉพาะสำหรับแพลตฟอร์ม Java โดยใช้โมเดลวัตถุของ Java การใช้ JNDI แอปพลิเคชั่นที่ใช้เทคโนโลยีจาวาสามารถจัดเก็บและเรียกค้นวัตถุ Java ที่มีชื่อทุกประเภท นอกจากนี้ JNDI ยังมีวิธีสำหรับการดำเนินการกับไดเรกทอรีมาตรฐานเช่นการเชื่อมโยงคุณสมบัติกับวัตถุและค้นหาวัตถุโดยใช้คุณสมบัติ

JNDI ยังถูกกำหนดโดยไม่ขึ้นกับการตั้งชื่อหรือการปรับใช้บริการไดเรกทอรีเฉพาะ มันช่วยให้แอปพลิเคชันเข้าถึงบริการที่แตกต่างกันหลายชื่อและไดเรกทอรีโดยใช้ API ทั่วไป ผู้ให้บริการการตั้งชื่อและไดเรกทอรีต่าง ๆ สามารถต่อเชื่อมกับ API ทั่วไปนี้ได้อย่างราบรื่น สิ่งนี้ทำให้แอปพลิเคชันที่ใช้เทคโนโลยี Java สามารถใช้ประโยชน์จากข้อมูลในบริการการตั้งชื่อและไดเรกทอรีที่มีอยู่หลากหลายเช่น LDAP, NDS, DNS และ NIS (YP) รวมถึงการเปิดใช้งานแอพพลิเคชั่นร่วมกับซอฟต์แวร์และระบบดั้งเดิม

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

การอ้างอิง


9

JNDI คืออะไร

JNDI ย่อมาจาก Java Naming and Directory Interface มันมาพร้อมกับมาตรฐาน J2EE

การใช้งานพื้นฐานคืออะไร?

ด้วย API นี้คุณสามารถเข้าถึงข้อมูลหลายประเภทเช่นวัตถุอุปกรณ์ไฟล์การตั้งชื่อและบริการไดเรกทอรีเช่น มันถูกใช้โดย EJB เพื่อค้นหาวัตถุระยะไกล JNDI ถูกออกแบบมาเพื่อให้ติดต่อกันในการเข้าถึงบริการที่มีอยู่เช่น DNS, NDS, LDAP, CORBA และ RMI

เมื่อมีการใช้งาน?

คุณสามารถใช้ JNDI เพื่อดำเนินการตั้งชื่อรวมถึงการดำเนินการอ่านและการดำเนินการสำหรับการอัพเดตเนมสเปซ การดำเนินงานดังต่อไปนี้จะมีคำอธิบายที่นี่


7

ชื่อบริการเชื่อมโยงชื่อกับวัตถุและค้นหาวัตถุตามชื่อที่กำหนด (รีจิสทรี RMI เป็นตัวอย่างที่ดีของบริการการตั้งชื่อ) JNDI มีอินเตอร์เฟสทั่วไปสำหรับบริการการตั้งชื่อที่มีอยู่มากมายเช่น LDAP, DNS

หากไม่มี JNDI ตำแหน่งหรือการเข้าถึงข้อมูลของทรัพยากรระยะไกลจะต้องมีการกำหนดค่าตายตัวในแอปพลิเคชันหรือทำให้พร้อมใช้งานในการกำหนดค่า การรักษาข้อมูลนี้ค่อนข้างน่าเบื่อและเกิดข้อผิดพลาดได้ง่าย


3

ฉันแค่อยากรู้ว่าทำไมเอกสารอย่างเป็นทางการถึงถูกเพิกเฉยซึ่งทำให้รายละเอียดอย่างละเอียดแล้ว

แต่ถ้าคุณต้องการที่จะเข้าใจกรณีโปรดดูคำตอบของ duffymo

Java Naming และ Directory Interface TM (JNDI) เป็น application programming interface (API) ที่จัดเตรียมฟังก์ชันการตั้งชื่อและไดเร็กทอรีให้กับแอ็พพลิเคชันที่เขียนโดยใช้ภาษาการเขียนโปรแกรมJava TM มันถูกกำหนดให้เป็นอิสระจากการดำเนินการบริการไดเรกทอรีที่เฉพาะเจาะจง ดังนั้นความหลากหลายของไดเรกทอรี - ใหม่เกิดขึ้นใหม่และปรับใช้แล้ว - สามารถเข้าถึงได้ในลักษณะทั่วไป

และสถาปัตยกรรมของมัน

ป้อนคำอธิบายรูปภาพที่นี่

และตามปกติคุณจะใช้มันอย่างไร


5
I am just curious why the official docs are so ignored which elaborate the details meticulously alreadyอาจเป็นเพราะพวกเขาไม่ได้อธิบายอย่างเพียงพอที่คนธรรมดาจะเข้าใจ?
skryvets

1

ฉันจะใช้ตัวอย่างหนึ่งเพื่ออธิบายวิธีที่ JNDI สามารถใช้ในการกำหนดค่าฐานข้อมูลโดยไม่ต้องมีผู้พัฒนาแอปพลิเคชันที่รู้ชื่อผู้ใช้และรหัสผ่านของฐานข้อมูล

1) เราได้กำหนดค่าแหล่งข้อมูลในเซิร์ฟเวอร์ของ JBoss แบบสแตนด์อโลน-full.xml นอกจากนี้เรายังสามารถกำหนดค่ารายละเอียดสระว่ายน้ำได้อีกด้วย

 <datasource jta="false" jndi-name="java:/DEV.DS" pool-name="DEV" enabled="true" use-ccm="false">
                <connection-url>jdbc:oracle:thin:@<IP>:1521:DEV</connection-url>
                <driver-class>oracle.jdbc.OracleDriver</driver-class>
                <driver>oracle</driver>
                <security>
                    <user-name>usname</user-name>
                    <password>pass</password>
                    </security>
                    <security>

 <security-domain>encryptedSecurityDomain</security-domain>
                    </security>

                <validation>
                    <validate-on-match>false</validate-on-match>
                    <background-validation>false</background-validation>
                    <background-validation-millis>1</background-validation-millis>
                </validation>
                <statement>
                    <prepared-statement-cache-size>0</prepared-statement-cache-size>
                    <share-prepared-statements>false</share-prepared-statements>
                    <pool>
                        <min-pool-size>5</min-pool-size>
                        <max-pool-size>10</max-pool-size>
                    </pool>
                </statement>
            </datasource>

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ jndi-name และออบเจ็กต์แหล่งข้อมูลที่เกี่ยวข้องจะพร้อมใช้งานสำหรับ application.application ของเรา

2) เราสามารถดึงข้อมูลวัตถุแหล่งข้อมูลนี้ได้โดยใช้คลาส JndiDataSourceLookup

ป้อนคำอธิบายรูปภาพที่นี่

Spring จะสร้างอินสแตนซ์ของแหล่งข้อมูลถั่วหลังจากเราให้ชื่อ jndi

ตอนนี้เราสามารถเปลี่ยนขนาดพูลชื่อผู้ใช้หรือรหัสผ่านตามสภาพแวดล้อมหรือข้อกำหนดของเราได้ แต่จะไม่ส่งผลกระทบต่อแอปพลิเคชัน

หมายเหตุ : เข้ารหัสความปลอดภัยโดเมนเราต้องกำหนดค่าแยกในเซิร์ฟเวอร์ JBoss เช่น

<security-domain name="encryptedSecurityDomain" cache-type="default">
                    <authentication>
                        <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                            <module-option name="username" value="<usernamefordb>"/>
                            <module-option name="password" value="894c8a6aegc8d028ce169c596d67afd0"/>
                        </login-module>
                    </authentication>
                </security-domain>

นี่เป็นหนึ่งในกรณีการใช้งาน หวังว่ามันชัดเจน


0

คำอธิบายที่ดีที่สุดสำหรับฉันมีให้ที่นี่

JNDI คืออะไร

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

เพื่อให้ง่ายมากมันก็เหมือนกับ hashmap ที่มีคีย์ String และค่า Object ที่แสดงถึงทรัพยากรบนเว็บ

JNDI แก้ปัญหาอะไรบ้าง

หากไม่มี JNDI ตำแหน่งหรือการเข้าถึงข้อมูลของทรัพยากรระยะไกลจะต้องมีการกำหนดค่าตายตัวในแอปพลิเคชันหรือทำให้พร้อมใช้งานในการกำหนดค่า การรักษาข้อมูลนี้ค่อนข้างน่าเบื่อและเกิดข้อผิดพลาดได้ง่าย

หากมีการย้ายทรัพยากรบนเซิร์ฟเวอร์อื่นด้วยที่อยู่ IP อื่นแอปพลิเคชันทั้งหมดที่ใช้ทรัพยากรนี้จะต้องได้รับการอัปเดตด้วยข้อมูลใหม่นี้ ด้วย JNDI สิ่งนี้ไม่จำเป็น ต้องอัพเดตเฉพาะการเชื่อมโยงทรัพยากรที่เกี่ยวข้องเท่านั้น แอปพลิเคชันยังคงสามารถเข้าถึงได้ด้วยชื่อและการย้ายที่โปร่งใส

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