Qu'est-ce que JNDI? Quelle est son utilisation de base? Quand est-il utilisé?

284
  • Qu'est-ce que JNDI ?

  • Quelle est son utilisation de base?

  • Quand est-il utilisé?

LetsSyncUp
la source
1
Voir l'article de blog personnel pour la définition et les cas d'utilisation: tshikatshikaaa.blogspot.com/2013/01/…
Jérôme Verstrynge

Réponses:

242

Qu'est-ce que JNDI?

Il signifie Java Naming and Directory Interface .

Quelle est son utilisation de base?

JNDI permet aux applications distribuées de rechercher des services d'une manière abstraite et indépendante des ressources.

Quand est-il utilisé?

Le cas d'utilisation le plus courant consiste à configurer un pool de connexions de base de données sur un serveur d'applications Java EE. Toute application déployée sur ce serveur peut accéder aux connexions dont elle a besoin en utilisant le nom JNDI java:comp/env/FooBarPoolsans avoir à connaître les détails de la connexion.

Cela présente plusieurs avantages:

  1. Si vous avez une séquence de déploiement dans laquelle les applications se déplacent des devl->int->test->prodenvironnements, vous pouvez utiliser le même nom JNDI dans chaque environnement et masquer la base de données réelle utilisée. Les applications n'ont pas à changer lorsqu'elles migrent entre les environnements.
  2. Vous pouvez réduire le nombre de personnes qui ont besoin de connaître les informations d'identification pour accéder à une base de données de production. Seul le serveur d'application Java EE doit savoir si vous utilisez JNDI.
duffymo
la source
9
c'est donc une alternative plus sûre que d'avoir un fichier de propriétés avec vos informations de connexion jdbc?
grinch
4
@grinch: Essentiellement oui. Il est plus sûr et plus standardisé, ce qui facilite le déploiement (pas besoin de deviner quel doit être le nom du fichier de propriétés, etc.).
sleske
Quelle est alors la différence entre l'utilisation de variables d'environnement et JNDI? Est-ce un concept similaire?
skryvets
101

Qu'est-ce que JNDI?

Java Naming and Directory Interface TM (JNDI) est une interface de programmation d'application (API) qui fournit des fonctionnalités de nommage et de répertoire aux applications écrites à l'aide du langage de programmation Java TM . Il est défini comme indépendant de toute implémentation de service d'annuaire spécifique. Ainsi, une variété d'annuaires (nouveaux, émergents et déjà déployés) sont accessibles de manière commune.

Quelle est son utilisation de base?

La majeure partie est couverte dans la réponse ci-dessus, mais je voudrais fournir une architecture ici afin que ce qui précède ait plus de sens.

entrez la description de l'image ici

Pour utiliser JNDI, vous devez avoir les classes JNDI et un ou plusieurs fournisseurs de services. Le SDK Java 2, v1.3 comprend trois fournisseurs de services pour les services de nommage / annuaire suivants:

  1. Protocole LDAP (Lightweight Directory Access Protocol)
  2. Service de noms Common Object Services (COS) de Common Object Request Broker Architecture (CORBA)
  3. Registre RMI (Java Remote Method Invocation)

Donc, fondamentalement, vous créez des objets et les enregistrez sur les services d'annuaire sur lesquels vous pourrez ensuite rechercher et exécuter l'opération.

Aniket Thakur
la source
30

JNDI en termes simples est essentiellement une interface pour pouvoir obtenir des instances de ressources internes / externes telles que

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

ou tout autre type défini par un adaptateur de ressources JCA. Il fournit une syntaxe permettant de créer des accès, qu'ils soient internes ou externes. c'est-à-dire (comp / env dans ce cas signifie où composant / environnement, il y a beaucoup d'autres syntaxes):

jndiContext.lookup("java:comp/env/persistence/customerDB");
mel3kings
la source
1
Ce n'est qu'une partie de l'image. JNDI vous permet de rechercher des objets Java - ils peuvent être des ressources comme un DataSource, ou autre chose, même java.lang.Stringdes informations de configuration.
sleske
3
@sleske Je vous suggère alors de faire votre propre réponse.
Ced
14

Présentation de JNDI

JNDI est une API spécifiée dans la technologie Java qui fournit des fonctionnalités de nommage et de répertoire aux applications écrites dans le langage de programmation Java. Il est spécialement conçu pour la plate-forme Java utilisant le modèle objet de Java. Grâce à JNDI, les applications basées sur la technologie Java peuvent stocker et récupérer des objets Java nommés de tout type. De plus, JNDI fournit des méthodes pour effectuer des opérations d'annuaire standard, telles que l'association d'attributs à des objets et la recherche d'objets à l'aide de leurs attributs.

JNDI est également défini indépendamment de toute implémentation de nommage ou de service d'annuaire spécifique. Il permet aux applications d'accéder à des services de nommage et d'annuaire différents, voire multiples, à l'aide d'une API commune. Différents fournisseurs de noms et de services d'annuaire peuvent être connectés de manière transparente derrière cette API commune. Cela permet aux applications basées sur la technologie Java de tirer parti des informations dans une variété de services de nommage et d'annuaire existants, tels que LDAP, NDS, DNS et NIS (YP), ainsi que de permettre aux applications de coexister avec les logiciels et systèmes hérités.

En utilisant JNDI comme outil, vous pouvez créer de nouvelles applications puissantes et portables qui non seulement profitent du modèle objet de Java, mais sont également bien intégrées à l'environnement dans lequel elles sont déployées.

Référence

Chathuranga Chandrasekara
la source
9

Qu'est-ce que JNDI?

JNDI signifie Java Naming and Directory Interface. Il est livré en standard avec J2EE.

Quelle est son utilisation de base?

Avec cette API, vous pouvez accéder à de nombreux types de données, comme les objets, les appareils, les fichiers de nommage et les services d'annuaire, par exemple. il est utilisé par EJB pour rechercher des objets distants. JNDI est conçu pour fournir une interface commune pour accéder aux services existants tels que DNS, NDS, LDAP, CORBA et RMI.

Quand est-il utilisé?

Vous pouvez utiliser le JNDI pour effectuer des opérations de dénomination, y compris des opérations de lecture et des opérations de mise à jour de l'espace de noms. Les opérations suivantes sont décrites ici .

Sabin Chirila
la source
7

Un service de nommage associe des noms à des objets et trouve des objets en fonction de leurs prénoms (le registre RMI est un bon exemple de service de nommage). JNDI fournit une interface commune à de nombreux services de nommage existants, tels que LDAP, DNS.

Sans JNDI, les informations de localisation ou d'accès des ressources distantes devraient être codées en dur dans les applications ou mises à disposition dans une configuration. La conservation de ces informations est assez fastidieuse et sujette aux erreurs.

Chetan Laddha
la source
3

Je suis juste curieux de savoir pourquoi les documents officiels sont si ignorés qui élaborent méticuleusement les détails déjà.

Mais si vous souhaitez comprendre les cas, veuillez vous référer à la réponse de duffymo .

Java Naming and Directory Interface TM (JNDI) est une interface de programmation d'application (API) qui fournit des fonctionnalités de nommage et de répertoire aux applications écrites à l'aide du langage de programmation Java TM . Il est défini comme indépendant de toute implémentation de service d'annuaire spécifique. Ainsi, une variété d'annuaires - nouveaux, émergents et déjà déployés - sont accessibles de manière commune.

Et son architecture

entrez la description de l'image ici

Et normalement comment vous l'utilisez .

Hearen
la source
5
I am just curious why the official docs are so ignored which elaborate the details meticulously alreadyPeut-être parce qu'ils n'expliquent pas suffisamment que les gens ordinaires peuvent comprendre?
skryvets
1

J'utiliserai un exemple pour expliquer comment JNDI peut être utilisé pour configurer la base de données sans qu'aucun développeur d'application ne connaisse le nom d'utilisateur et le mot de passe de la base de données.

1) Nous avons configuré la source de données dans standalone-full.xml du serveur JBoss . De plus, nous pouvons également configurer les détails du pool.

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

entrez la description de l'image ici

Maintenant, ce nom jndi et son objet source de données associé seront disponibles pour notre application.application.

2) Nous pouvons récupérer cet objet de source de données en utilisant la classe JndiDataSourceLookup.

entrez la description de l'image ici

Spring instanciera le bean de la source de données, une fois que nous aurons fourni le nom jndi.

Maintenant, nous pouvons changer la taille du pool, le nom d'utilisateur ou le mot de passe selon notre environnement ou nos exigences, mais cela n'aura pas d'impact sur l'application.

Remarque : encryptedSecurityDomain, nous devons le configurer séparément dans le serveur JBoss comme

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

C'est l'un des cas d'utilisation. J'espère que cela clarifie.

Yogesh Sanchihar
la source
0

La meilleure explication pour moi est donnée ici

Qu'est-ce que JNDI

Il s'agit d'une API permettant d'accéder à un service d'annuaire, c'est-à-dire un nom de mappage de service (chaînes) avec des objets, une référence à des objets distants ou des données simples . C'est ce qu'on appelle la liaison. L'ensemble des liaisons est appelé le contexte . Les applications utilisent l'interface JNDI pour accéder aux ressources.

Pour le dire très simplement, c'est comme une table de hachage avec une clé String et des valeurs Object représentant des ressources sur le Web.

Quels problèmes JNDI résout-il

Sans JNDI, les informations de localisation ou d'accès des ressources distantes devraient être codées en dur dans les applications ou mises à disposition dans une configuration. La conservation de ces informations est assez fastidieuse et sujette aux erreurs.

Si une ressource a été déplacée sur un autre serveur, avec une autre adresse IP, par exemple, toutes les applications utilisant cette ressource devront être mises à jour avec ces nouvelles informations. Avec JNDI, ce n'est pas nécessaire. Seule la liaison de ressources correspondante doit être mise à jour. Les applications peuvent toujours y accéder avec son nom et la relocalisation est transparente.

xagaffar
la source