Що таке JNDI? Яке його основне використання? Коли він використовується?


Відповіді:


241

Що таке JNDI?

Він розшифровується як Java Naming та Directory Interface .

Яке його основне використання?

JNDI дозволяє розподіленим програмам шукати служби абстрактно, незалежно від ресурсів.

Коли він використовується?

Найпоширеніший випадок використання - це налаштування пулу підключення до бази даних на сервері додатків Java EE. Будь-яка програма, розгорнута на цьому сервері, може отримати доступ до потрібних з'єднань, використовуючи ім'я JNDI, java:comp/env/FooBarPoolне знаючи деталей про з'єднання.

Це має ряд переваг:

  1. Якщо у вас є послідовність розгортання, де програми переміщуються з devl->int->test->prodсередовищ, ви можете використовувати одне і те ж ім'я JNDI у кожному середовищі та приховати фактичну базу даних, яка використовується. Програми не повинні змінюватися, оскільки вони мігрують між середовищами.
  2. Ви можете мінімізувати кількість людей, яким потрібно знати облікові дані для доступу до виробничої бази даних. Тільки сервер додатків Java EE повинен знати, якщо ви використовуєте JNDI.

9
тож це в основному більш безпечна альтернатива наявності файлу властивостей з інформацією про з'єднання jdbc?
усміхнувся

4
@grinch: По суті так. Це безпечніше і більш стандартизовано, тим самим полегшує розгортання (не потрібно здогадуватися, яким має бути ім'я файлу властивостей тощо).
sleske

У чому тоді різниця між використанням змінних середовища та JNDI? Це схожа концепція?
скривець

100

Що таке JNDI?

Java Naming and Directory Interface TM (JNDI) - це інтерфейс програмування додатків (API), який забезпечує функціонування імен та каталогів додатків, написаних мовою програмування Java TM . Він визначений як незалежний від будь-якої конкретної реалізації каталогу послуг. Таким чином, до різноманітних каталогів (нових, нових, і вже розгорнутих) можна отримати доступ загальним способом.

Яке його основне використання?

Більшість із них висвітлена у наведеній вище відповіді, але я хотів би надати тут архітектуру, щоб вище було більше сенсу.

введіть тут опис зображення

Щоб використовувати JNDI, ви повинні мати класи JNDI та одного або декількох постачальників послуг. Java 2 SDK, v1.3 включає три постачальника послуг для таких служб імен / каталогів:

  1. Легкий протокол доступу до каталогу (LDAP)
  2. Загальна послуга імен загальних об’єктних запитів архітектури (CORBA)
  3. Реєстр викликів методів віддаленого методу Java (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. Він надає синтаксис у можливості створити доступ, будь то внутрішній чи зовнішній. тобто (comp / env у цьому випадку означає, де компонент / середовище є багато інших синтаксисів):

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

1
Це лише частина картини. JNDI дозволяє шукати об'єкти Java - вони можуть бути ресурсами, такими як DataSource, або щось інше, навіть прості java.lang.Stringдля інформації про конфігурацію.
sleske

3
@sleske Я пропоную тобі власно відповісти.
Сід

14

Огляд JNDI

JNDI - це API, визначений в технології Java, який забезпечує функціонування імен і директорій для програм, написаних мовою програмування Java. Він розроблений спеціально для платформи Java з використанням об'єктної моделі Java. Використовуючи JNDI, програми, засновані на технології Java, можуть зберігати та отримувати іменовані об'єкти Java будь-якого типу. Крім того, JNDI надає методи для виконання стандартних операцій каталогів, таких як асоціація атрибутів з об'єктами та пошук об'єктів за допомогою їх атрибутів.

JNDI також визначається незалежно від будь-якої конкретної реалізації імен або служб каталогів. Це дозволяє програмам отримувати доступ до різних, можливо декількох, служб імен та каталогів за допомогою спільного API. Різні постачальники послуг з імен та каталогів можуть легко підключатися за цим загальним API. Це дозволяє додаткам на базі технологій Java скористатися інформацією в різних існуючих службах імен та каталогів, таких як LDAP, NDS, DNS та NIS (YP), а також дозволяє програмам співіснувати зі застарілим програмним забезпеченням та системами.

Використовуючи JNDI як інструмент, ви можете створювати нові потужні та портативні додатки, які не тільки користуються об’єктною моделлю Java, але й добре інтегруються з середовищем, в якому вони розміщені.

Довідково


9

Що таке JNDI?

JNDI розшифровується як інтерфейс Java Naming та Directory Interface. Він поставляється стандартно з J2EE.

Яке його основне використання?

За допомогою цього API ви можете отримати доступ до багатьох типів даних, наприклад, до об'єктів, пристроїв, файлів служб імен та служб каталогів, наприклад. він використовується EJB для пошуку віддалених об'єктів. JNDI призначений для надання загального інтерфейсу для доступу до існуючих служб, таких як DNS, NDS, LDAP, CORBA та RMI.

Коли він використовується?

Ви можете використовувати JNDI для виконання іменних операцій, включаючи операції зчитування та операції з оновлення простору імен. Наступні операції описані тут .


7

Служба іменування пов'язує імена з об'єктами та знаходить об'єкти на основі їх імен. (Реєстр RMI є хорошим прикладом служби іменування.) JNDI надає загальний інтерфейс для багатьох існуючих служб іменування, таких як LDAP, DNS.

Без JNDI інформацію про місцеположення або доступ до віддалених ресурсів потрібно було б чітко кодувати в додатках або бути доступною в конфігурації. Забезпечення цієї інформації є досить втомливим та схильним до помилок.


3

Мені просто цікаво, чому офіційні документи так ігноруються, що детально розглядають деталі.

Але якщо ви хочете розібратися у випадках, зверніться до відповіді duffymo .

Java Naming and Directory Interface TM (JNDI) - це інтерфейс програмування додатків (API), який забезпечує функціонування імен та каталогів додатків, написаних мовою програмування Java TM . Він визначений як незалежний від будь-якої конкретної реалізації каталогу послуг. Таким чином, до різних каталогів - нових, що з'являються та вже розгорнутих - можна отримати доступ загальним способом.

І його архітектура

введіть тут опис зображення

І зазвичай, як ви цим користуєтеся .


5
I am just curious why the official docs are so ignored which elaborate the details meticulously alreadyМоже тому, що вони не пояснюють достатньою мірою, щоб звичайні люди могли зрозуміти?
скривець

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-ім'я та пов'язаний з ним об’єкт джерела даних буде доступно для нашого застосування.

2) Ми можемо отримати цей об'єкт даних за допомогою класу JndiDataSourceLookup.

введіть тут опис зображення

Весна створить джерело джерела даних, після того, як ми надамо jndi-ім'я.

Тепер ми можемо змінити розмір пулу, ім’я користувача або пароль відповідно до нашого оточення чи вимог, але це не вплине на додаток.

Примітка : encryptedSecurityDomain, нам потрібно налаштувати його окремо на сервері 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 для доступу до ресурсів.

Простіше кажучи, це як хеш-карта з клавішею String і об'єктними значеннями, що представляють ресурси в Інтернеті.

Які проблеми вирішує JNDI

Без JNDI інформацію про місцеположення або доступ до віддалених ресурсів потрібно було б чітко кодувати в додатках або бути доступною в конфігурації. Забезпечення цієї інформації є досить втомливим та схильним до помилок.

Якщо ресурси було перенесено на інший сервер, наприклад, з іншою IP-адресою, усі додатки, що використовують цей ресурс, повинні бути оновлені цією новою інформацією. З JNDI це не потрібно. Необхідно оновлювати лише відповідне прив'язування ресурсів. Програми все ще можуть отримати доступ до нього з назвою, а переміщення - прозорим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.