Что такое JNDI? Каково его основное использование? Когда это используется?

284
  • Что такое JNDI ?

  • Каково его основное использование?

  • Когда это используется?

LetsSyncUp
источник
1
Смотрите личное сообщение в блоге для определения и вариантов использования: tshikatshikaaa.blogspot.com/2013/01/…
Jérôme Verstrynge

Ответы:

242

Что такое JNDI?

Он обозначает Java Naming и Directory Interface .

Каково его основное использование?

JNDI позволяет распределенным приложениям искать сервисы абстрактным, независимым от ресурсов способом.

Когда это используется?

Наиболее распространенный вариант использования - настройка пула соединений с базой данных на сервере приложений Java EE. Любое приложение, развернутое на этом сервере, может получить доступ к нужным соединениям, используя имя JNDI, java:comp/env/FooBarPoolбез необходимости знать подробности о соединении.

Это имеет несколько преимуществ:

  1. Если у вас есть последовательность развертывания, когда приложения перемещаются из devl->int->test->prodсред, вы можете использовать одно и то же имя JNDI в каждой среде и скрыть фактическую базу данных, которая используется. Приложения не должны изменяться при миграции между средами.
  2. Вы можете минимизировать количество людей, которым необходимо знать учетные данные для доступа к производственной базе данных. Только сервер приложений Java EE должен знать, используете ли вы JNDI.
duffymo
источник
9
так что это в основном более безопасная альтернатива наличию файла свойств с информацией о вашем соединении jdbc?
ухмыльнулся
4
@ Гринч: По сути, да. Это безопаснее и более стандартизировано, что упрощает развертывание (не нужно угадывать, как должно называться имя файла свойств и т. Д.).
слеске
Какая тогда разница между использованием переменных окружения и JNDI? Это похожая концепция?
скрывец
101

Что такое JNDI?

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

Каково его основное использование?

Большая часть описана в ответе выше, но я хотел бы представить здесь архитектуру, чтобы выше было больше смысла.

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

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

  1. Облегченный протокол доступа к каталогам (LDAP)
  2. Архитектура посредника запросов общих объектов (CORBA) Служба имен общих служб объектов (COS)
  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");
mel3kings
источник
1
Это только часть картины. JNDI позволяет вам искать объекты Java - они могут быть ресурсами, такими как DataSource, или чем-то еще, даже простым java.lang.Stringдля информации о конфигурации.
слеске
3
@Sleske Я предлагаю вам сделать свой собственный ответ.
Ced
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 and Directory Interface. Стандартно поставляется с J2EE.

Каково его основное использование?

С помощью этого API вы можете получить доступ ко многим типам данных, таким как объекты, устройства, файлы именования и службы каталогов, например. он используется EJB для поиска удаленных объектов. JNDI предназначен для обеспечения общего интерфейса для доступа к существующим службам, таким как DNS, NDS, LDAP, CORBA и RMI.

Когда это используется?

Вы можете использовать JNDI для выполнения операций именования, включая операции чтения и операции для обновления пространства имен. Следующие операции описаны здесь .

Сабин Кирила
источник
7

Служба именования связывает имена с объектами и находит объекты на основе их заданных имен (реестр RMI является хорошим примером службы именования.) JNDI предоставляет общий интерфейс для многих существующих служб именования, таких как LDAP, DNS.

Без JNDI информация о местоположении или доступе к удаленным ресурсам должна быть жестко задана в приложениях или сделана доступной в конфигурации. Сохранение этой информации довольно утомительно и подвержено ошибкам.

Четан Ладдха
источник
3

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

Но если вы хотите понять случаи, пожалуйста, обратитесь к ответу Даффимо .

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

И его архитектура

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

И обычно, как вы используете это .

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

Я буду использовать один пример, чтобы объяснить, как JNDI можно использовать для настройки базы данных, при этом ни один разработчик приложения не знает имени пользователя и пароля базы данных.

1) Мы настроили источник данных в standalone-full.xml сервера JBoss . Кроме того, мы также можем настроить параметры пула.

 <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-имя и связанный с ним объект источника данных будут доступны для нашего application.application.

2) Мы можем получить этот объект источника данных, используя класс JndiDataSourceLookup.

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

Spring создаст экземпляр компонента источника данных после того, как мы предоставим 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 и значениями Object, представляющими ресурсы в сети.

Какие проблемы решает JNDI?

Без JNDI информация о местоположении или доступе к удаленным ресурсам должна быть жестко задана в приложениях или сделана доступной в конфигурации. Сохранение этой информации довольно утомительно и подвержено ошибкам.

Если ресурсы были перемещены на другой сервер, например, с другим IP-адресом, все приложения, использующие этот ресурс, должны быть обновлены с помощью этой новой информации. С JNDI это не обязательно. Только соответствующая привязка ресурса должна быть обновлена. Приложения по-прежнему могут обращаться к нему по его имени, и перемещение является прозрачным.

xagaffar
источник