JNDI nedir? Temel kullanımı nedir? Ne zaman kullanılır?


Yanıtlar:


242

JNDI nedir?

Java Adlandırma ve Dizin Arayüzü anlamına gelir .

Temel kullanımı nedir?

JNDI, dağıtılmış uygulamaların hizmetleri soyut, kaynaktan bağımsız bir şekilde aramalarına olanak tanır.

Ne zaman kullanılır?

En yaygın kullanım durumu bir Java EE uygulama sunucusunda bir veritabanı bağlantı havuzu kurmaktır. Bu sunucuda dağıtılan herhangi bir uygulama, bağlantı java:comp/env/FooBarPoolhakkındaki ayrıntıları bilmek zorunda kalmadan JNDI adını kullanarak ihtiyaç duydukları bağlantılara erişebilir .

Bunun birkaç avantajı vardır:

  1. Uygulamaların devl->int->test->prodortamlardan taşındığı bir dağıtım sırasınız varsa, her ortamda aynı JNDI adını kullanabilir ve kullanılan gerçek veritabanını gizleyebilirsiniz. Uygulamalar ortamlar arasında geçiş yaptıkları için değişmek zorunda değildir.
  2. Bir üretim veritabanına erişmek için kimlik bilgilerini bilmesi gereken kişi sayısını en aza indirebilirsiniz. JNDI kullanıp kullanmadığınızı yalnızca Java EE uygulama sunucusunun bilmesi gerekir.

9
bu temelde jdbc bağlantı bilgilerinizle bir özellikler dosyasına sahip olmak için daha güvenli bir alternatif mi?
grinch

4
@grinch: Esasen evet. Daha güvenli ve daha standart hale getirildiğinden, dağıtımı kolaylaştırır (özellikler dosyasının adının ne olması gerektiğini tahmin etmeye gerek yoktur vb.).
sleske

O halde ortam değişkenleri ile JNDI arasındaki fark nedir? Benzer bir kavram mı?
skryvets

101

JNDI nedir?

Java Adlandırma ve Dizin Arabirimi TM (JNDI), Java TM programlama dili kullanılarak yazılan uygulamalara adlandırma ve dizin işlevselliği sağlayan bir uygulama programlama arabirimidir (API) . Herhangi bir dizin hizmeti uygulamasından bağımsız olarak tanımlanır. Böylece çeşitli dizinlere (yeni, ortaya çıkan ve zaten konuşlandırılan) ortak bir şekilde erişilebilir.

Temel kullanımı nedir?

Çoğunluğu yukarıdaki cevapta kapsanıyor, ancak yukarıda daha mantıklı olması için burada mimari sağlamak istiyorum.

resim açıklamasını buraya girin

JNDI kullanmak için, JNDI sınıflarına ve bir veya daha fazla hizmet sağlayıcısına sahip olmanız gerekir. Java 2 SDK, v1.3, aşağıdaki adlandırma / dizin hizmetleri için üç hizmet sağlayıcı içerir:

  1. Basit Dizin Erişim Protokolü (LDAP)
  2. Ortak Nesne İstek Aracısı Mimarisi (CORBA) Ortak Nesne Hizmetleri (COS) ad hizmeti
  3. Java Uzaktan Yöntem Çağırma (RMI) Kaydı

Yani temelde nesneler yaratır ve daha sonra arama yapıp işlemi yürütebileceğiniz dizin hizmetlerine kaydedersiniz.


30

Layman'ın terimleriyle JNDI temelde dahili / harici kaynakların örneklerini alabilmek için bir arayüzdür.

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

veya bir JCA kaynak bağdaştırıcısı tarafından tanımlanan başka herhangi bir tür. İster dahili ister harici olsun erişim oluşturabilme konusunda bir sözdizimi sağlar. yani (bu örnekte comp / env, bileşen / ortamın başka birçok sözdizimi olduğu anlamına gelir):

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

1
Bu resmin sadece bir kısmı. JNDI, Java nesnelerini aramanıza izin verir - bunlar bir DataSource gibi kaynaklar veya java.lang.Stringyapılandırma bilgileri için düz bir şey olabilir .
sleske

3
@sleske O zaman kendi cevabınızı vermenizi öneririm.
Ced

14

JNDI Genel Bakış

JNDI, Java programlama dilinde yazılmış uygulamalara adlandırma ve dizin işlevselliği sağlayan Java teknolojisinde belirtilen bir API'dir. Özellikle Java'nın nesne modelini kullanan Java platformu için tasarlanmıştır. JNDI kullanarak, Java teknolojisine dayalı uygulamalar, herhangi bir türde adlandırılmış Java nesnelerini depolayabilir ve alabilir. Buna ek olarak, JNDI, öznitelikleri nesnelerle ilişkilendirme ve özniteliklerini kullanarak nesneleri arama gibi standart dizin işlemlerini gerçekleştirmek için yöntemler sağlar.

JNDI ayrıca belirli bir adlandırma veya dizin hizmeti uygulamasından bağımsız olarak tanımlanır. Uygulamaların ortak bir API kullanarak farklı, muhtemelen birden çok adlandırma ve dizin hizmetlerine erişmesini sağlar. Farklı adlandırma ve dizin hizmeti sağlayıcıları, bu ortak API'nın arkasına sorunsuz bir şekilde takılabilir. Bu, Java teknolojisi tabanlı uygulamaların LDAP, NDS, DNS ve NIS (YP) gibi çeşitli varolan adlandırma ve dizin hizmetlerindeki bilgilerden yararlanmasını ve ayrıca uygulamaların eski yazılım ve sistemlerle bir arada bulunmasını sağlar.

JNDI'yı bir araç olarak kullanarak, yalnızca Java'nın nesne modelinden yararlanmakla kalmayıp aynı zamanda konuşlandırıldıkları ortamla iyi entegre edilmiş yeni güçlü ve taşınabilir uygulamalar oluşturabilirsiniz.

Referans


9

JNDI nedir?

JNDI, Java Adlandırma ve Dizin Arayüzü anlamına gelir. J2EE ile standart olarak gelir.

Temel kullanımı nedir?

Bu API ile, nesneler, cihazlar, adlandırma dosyaları ve dizin hizmetleri gibi birçok veri türüne erişebilirsiniz. EJB tarafından uzak nesneleri bulmak için kullanılır. JNDI, DNS, NDS, LDAP, CORBA ve RMI gibi mevcut hizmetlere erişmek için ortak bir arabirim sağlamak üzere tasarlanmıştır.

Ne zaman kullanılır?

JNDI'yı okuma alanı ve ad alanını güncelleştirme işlemleri de dahil olmak üzere adlandırma işlemlerini gerçekleştirmek için kullanabilirsiniz. Aşağıdaki işlemler burada açıklanmıştır .


7

Bir adlandırma hizmeti, adları nesnelerle ilişkilendirir ve verilen adlarına göre nesneleri bulur. (RMI kayıt defteri bir adlandırma hizmetine iyi bir örnektir.) JNDI, LDAP, DNS gibi varolan birçok adlandırma hizmetine ortak bir arabirim sağlar.

JNDI olmadan, uzak kaynakların konum veya erişim bilgilerinin uygulamalarda sabit olarak kodlanması veya bir yapılandırmada kullanılabilir hale getirilmesi gerekir. Bu bilgilerin korunması oldukça sıkıcı ve hataya açıktır.


3

Sadece resmi belgelerin neden bu kadar göz ardı edildiğini merak ediyorum , bu da detayları zaten titizlikle detaylandırıyor.

Ancak vakaları anlamak istiyorsanız, lütfen duffymo'nun cevabına bakın .

Java Adlandırma ve Dizin Arabirimi TM (JNDI), Java TM programlama dili kullanılarak yazılan uygulamalara adlandırma ve dizin işlevselliği sağlayan bir uygulama programlama arabirimidir (API) . Herhangi bir dizin hizmeti uygulamasından bağımsız olarak tanımlanır. Böylece, çeşitli dizinlere - yeni, ortaya çıkan ve önceden konuşlandırılan - ortak bir yolla erişilebilir.

Ve mimarisi

resim açıklamasını buraya girin

Ve normalde nasıl kullandığınız .


5
I am just curious why the official docs are so ignored which elaborate the details meticulously alreadyBelki düzenli insanların anlayabileceği yeterli bir şekilde açıklama yapmadıkları için?
skryvets

1

JNDI, veritabanının kullanıcı adını ve şifresini bilen herhangi bir uygulama geliştiricisi olmadan veritabanını yapılandırmak için nasıl kullanılabileceğini açıklamak için bir örnek kullanacağım.

1) Veri kaynağını JBoss sunucusunun tek başına full.xml dosyasında yapılandırdık . Ayrıca, havuz ayrıntılarını da yapılandırabiliriz.

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

resim açıklamasını buraya girin

Şimdi, bu jndi-adı ve ilişkili veri kaynağı nesnesi application.application için kullanılabilir olacak.

2) Bu veri kaynağı nesnesini JndiDataSourceLookup sınıfını kullanarak alabiliriz.

resim açıklamasını buraya girin

Jndi adını verdikten sonra, bahar veri kaynağı fasulyesini başlatacaktır.

Artık havuz boyutunu, kullanıcı adını veya şifreyi ortamımıza veya gereksinimimize göre değiştirebiliriz, ancak uygulamayı etkilemez.

Not : şifreliSecurityDomain, JBoss sunucusunda ayrı olarak yapılandırmamız gerekir.

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

Bu kullanım durumlarından biridir. Umarım açıklar.


0

Bana en iyi açıklama burada verilmiştir .

JNDI nedir

Bir dizin hizmetine, yani nesnelerle birlikte bir hizmet eşleme adı (dizeleri), uzak nesnelere başvuru veya basit verilere erişim sağlayan bir API'dir . Buna bağlama denir. Bağlama kümesine bağlam denir . Uygulamalar kaynaklara erişmek için JNDI arabirimini kullanır.

Basitçe ifade etmek gerekirse, bir String anahtarı ve web üzerindeki kaynakları temsil eden Object değerleri olan bir hashmap gibidir.

JNDI Hangi Sorunları Çözüyor

JNDI olmadan, uzak kaynakların konum veya erişim bilgilerinin uygulamalarda sabit olarak kodlanması veya bir yapılandırmada kullanılabilir hale getirilmesi gerekir. Bu bilgilerin korunması oldukça sıkıcı ve hataya açıktır.

Bir kaynak başka bir sunucuda, örneğin başka bir IP adresiyle yeniden konumlandırıldıysa, bu kaynağı kullanan tüm uygulamaların bu yeni bilgilerle güncellenmesi gerekir. JNDI ile bu gerekli değildir. Yalnızca ilgili kaynak bağının güncellenmesi gerekir. Uygulamalar yine de adıyla erişebilir ve yer değiştirme şeffaftır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.