JNDI là gì? Công dụng cơ bản của nó là gì? Khi nào nó được sử dụng?


Câu trả lời:


241

JNDI là gì?

Nó là viết tắt của Java Đặt tên và Giao diện thư mục .

Công dụng cơ bản của nó là gì?

JNDI cho phép các ứng dụng phân tán tra cứu các dịch vụ theo cách trừu tượng, không phụ thuộc vào tài nguyên.

Khi nào nó được sử dụng?

Trường hợp sử dụng phổ biến nhất là thiết lập nhóm kết nối cơ sở dữ liệu trên máy chủ ứng dụng Java EE. Bất kỳ ứng dụng nào được triển khai trên máy chủ đó đều có thể có quyền truy cập vào các kết nối họ cần bằng tên JNDI java:comp/env/FooBarPoolmà không cần phải biết chi tiết về kết nối.

Điều này có một số lợi thế:

  1. Nếu bạn có một chuỗi triển khai nơi các ứng dụng di chuyển từ các devl->int->test->prodmôi trường, bạn có thể sử dụng cùng tên JNDI trong mỗi môi trường và ẩn cơ sở dữ liệu thực tế đang được sử dụng. Các ứng dụng không phải thay đổi khi chúng di chuyển giữa các môi trường.
  2. Bạn có thể giảm thiểu số lượng người cần biết thông tin đăng nhập để truy cập cơ sở dữ liệu sản xuất. Chỉ máy chủ ứng dụng Java EE cần biết nếu bạn sử dụng JNDI.

9
Vì vậy, đây về cơ bản là một sự thay thế an toàn hơn để có một tệp thuộc tính với thông tin kết nối jdbc của bạn?
grinch

4
@grinch: Thực chất là có. Nó an toàn hơn, và được chuẩn hóa hơn, do đó làm cho việc triển khai dễ dàng hơn (không cần phải đoán tên của tệp thuộc tính phải là gì, v.v.).
sleske

Vậy thì sự khác biệt giữa việc sử dụng các biến môi trường và JNDI là gì? Có phải đó là khái niệm tương tự?
skryvets

100

JNDI là gì?

Các đặt tên Java và Directory Interface TM (JNDI) là một giao diện lập trình ứng dụng (API) cung cấp tên và chức năng thư mục cho các ứng dụng viết bằng Java TM ngôn ngữ lập trình. Nó được định nghĩa là độc lập với bất kỳ triển khai dịch vụ thư mục cụ thể. Do đó, một loạt các thư mục (mới, mới nổi và đã được triển khai) có thể được truy cập theo cách phổ biến.

Công dụng cơ bản của nó là gì?

Hầu hết nó được đề cập trong câu trả lời ở trên nhưng tôi muốn cung cấp kiến ​​trúc ở đây để ở trên sẽ có ý nghĩa hơn.

nhập mô tả hình ảnh ở đây

Để sử dụng JNDI, bạn phải có các lớp JNDI và một hoặc nhiều nhà cung cấp dịch vụ. SDK Java 2, v1.3 bao gồm ba nhà cung cấp dịch vụ cho các dịch vụ đặt tên / thư mục sau:

  1. Giao thức truy cập thư mục nhẹ (LDAP)
  2. Yêu cầu đối tượng chung Kiến trúc môi giới (CORBA) Dịch vụ tên đối tượng chung (COS)
  3. Sổ đăng ký gọi phương thức từ xa (RMI) Java

Vì vậy, về cơ bản, bạn tạo các đối tượng và đăng ký chúng trên các dịch vụ thư mục mà sau này bạn có thể thực hiện tra cứu và thực hiện thao tác trên đó.


30

JNDI theo thuật ngữ của giáo dân về cơ bản là một Giao diện để có thể nhận các phiên bản của tài nguyên bên trong / bên ngoài, chẳng hạn như

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

hoặc bất kỳ loại nào khác được xác định bởi bộ điều hợp tài nguyên JCA. Nó cung cấp một cú pháp trong việc có thể tạo quyền truy cập cho dù chúng là nội bộ hay bên ngoài. tức là (comp / env trong trường hợp này có nghĩa là nơi thành phần / môi trường, có rất nhiều cú pháp khác):

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

1
Đây chỉ là một phần của bức tranh. JNDI cho phép bạn tra cứu các đối tượng Java - chúng có thể là các tài nguyên như DataSource hoặc một cái gì đó khác, thậm chí đơn giản java.lang.Stringcho thông tin cấu hình.
sleske

3
@sleske Tôi đề nghị bạn tự đưa ra câu trả lời.
Ced

14

Tổng quan về JNDI

JNDI là một API được chỉ định trong công nghệ Java, cung cấp chức năng đặt tên và thư mục cho các ứng dụng được viết bằng ngôn ngữ lập trình Java. Nó được thiết kế đặc biệt cho nền tảng Java bằng mô hình đối tượng của Java. Sử dụng JNDI, các ứng dụng dựa trên công nghệ Java có thể lưu trữ và truy xuất các đối tượng Java có tên thuộc bất kỳ loại nào. Ngoài ra, JNDI cung cấp các phương thức để thực hiện các hoạt động thư mục tiêu chuẩn, chẳng hạn như liên kết các thuộc tính với các đối tượng và tìm kiếm các đối tượng bằng các thuộc tính của chúng.

JNDI cũng được định nghĩa độc lập với bất kỳ việc thực hiện dịch vụ đặt tên hoặc thư mục cụ thể nào. Nó cho phép các ứng dụng truy cập các dịch vụ thư mục, đặt tên và thư mục khác nhau, có thể sử dụng API chung. Các nhà cung cấp dịch vụ đặt tên và thư mục khác nhau có thể được cắm liền mạch đằng sau API chung này. Điều này cho phép các ứng dụng dựa trên công nghệ Java tận dụng thông tin trong nhiều dịch vụ đặt tên và thư mục hiện có, chẳng hạn như LDAP, NDS, DNS và NIS (YP), cũng như cho phép các ứng dụng cùng tồn tại với các hệ thống và phần mềm cũ.

Sử dụng JNDI làm công cụ, bạn có thể xây dựng các ứng dụng di động và mạnh mẽ mới, không chỉ tận dụng mô hình đối tượng của Java mà còn được tích hợp tốt với môi trường mà chúng được triển khai.

Tài liệu tham khảo


9

JNDI là gì?

JNDI là viết tắt của Java Đặt tên và Giao diện thư mục. Nó có tiêu chuẩn với J2EE.

Công dụng cơ bản của nó là gì?

Với API này, bạn có thể truy cập nhiều loại dữ liệu, như các đối tượng, thiết bị, tệp đặt tên và dịch vụ thư mục, vd. nó được EJB sử dụng để tìm các đối tượng ở xa. JNDI được thiết kế để cung cấp giao diện chung để truy cập các dịch vụ hiện có như DNS, NDS, LDAP, CORBA và RMI.

Khi nào nó được sử dụng?

Bạn có thể sử dụng JNDI để thực hiện các thao tác đặt tên, bao gồm các thao tác đọc và thao tác để cập nhật không gian tên. Các hoạt động sau đây được mô tả ở đây .


7

Dịch vụ đặt tên liên kết tên với các đối tượng và tìm các đối tượng dựa trên tên đã cho của chúng. (Đăng ký RMI là một ví dụ điển hình về dịch vụ đặt tên.) JNDI cung cấp giao diện chung cho nhiều dịch vụ đặt tên hiện có, như LDAP, DNS.

Không có JNDI, vị trí hoặc thông tin truy cập của các tài nguyên từ xa sẽ phải được mã hóa cứng trong các ứng dụng hoặc được cung cấp trong cấu hình. Duy trì thông tin này là khá tẻ nhạt và dễ bị lỗi.


3

Tôi chỉ tò mò tại sao các tài liệu chính thức lại bị bỏ qua mà công phu các chi tiết tỉ mỉ rồi.

Nhưng nếu bạn muốn hiểu các trường hợp, xin vui lòng tham khảo câu trả lời của duffymo .

Các đặt tên Java và Directory Interface TM (JNDI) là một giao diện lập trình ứng dụng (API) cung cấp tên và chức năng thư mục cho các ứng dụng viết bằng Java TM ngôn ngữ lập trình. Nó được định nghĩa là độc lập với bất kỳ triển khai dịch vụ thư mục cụ thể. Do đó, một loạt các thư mục - mới, mới nổi và đã được triển khai - có thể được truy cập theo cách phổ biến.

Và kiến ​​trúc của nó

nhập mô tả hình ảnh ở đây

Và thông thường cách bạn sử dụng nó .


5
I am just curious why the official docs are so ignored which elaborate the details meticulously alreadyCó lẽ bởi vì họ không giải thích một cách đầy đủ mà những người bình thường có thể hiểu?
skryvets

1

Tôi sẽ sử dụng một ví dụ để giải thích cách JNDI có thể được sử dụng để định cấu hình cơ sở dữ liệu mà không có nhà phát triển ứng dụng nào biết tên người dùng và mật khẩu của cơ sở dữ liệu.

1) Chúng tôi đã định cấu hình nguồn dữ liệu trong độc lập-full.xml của máy chủ JBoss . Ngoài ra, chúng tôi có thể cấu hình chi tiết hồ bơi cũng.

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

nhập mô tả hình ảnh ở đây

Bây giờ, tên jndi này và đối tượng nguồn dữ liệu liên quan của nó sẽ có sẵn cho application.application của chúng tôi.

2) Chúng ta có thể truy xuất đối tượng nguồn dữ liệu này bằng lớp JndiDataSourceLookup.

nhập mô tả hình ảnh ở đây

Spring sẽ khởi tạo bean nguồn dữ liệu, sau khi chúng tôi cung cấp tên jndi.

Bây giờ, chúng tôi có thể thay đổi kích thước nhóm, tên người dùng hoặc mật khẩu theo môi trường hoặc yêu cầu của chúng tôi, nhưng nó sẽ không ảnh hưởng đến ứng dụng.

Lưu ý : mã hóaSecurityDomain, chúng tôi cần định cấu hình riêng trong máy chủ JBoss như

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

Đây là một trong những trường hợp sử dụng. Hy vọng nó làm rõ.


0

Giải thích tốt nhất cho tôi được đưa ra ở đây

JNDI là gì

Đó là một API để cung cấp quyền truy cập vào một dịch vụ thư mục, nghĩa là một tên ánh xạ dịch vụ (chuỗi) với các đối tượng, tham chiếu đến các đối tượng từ xa hoặc dữ liệu đơn giản . Điều này được gọi là ràng buộc. Tập hợp các ràng buộc được gọi là bối cảnh . Các ứng dụng sử dụng giao diện JNDI để truy cập tài nguyên.

Nói một cách đơn giản, nó giống như một hashmap với khóa String và các giá trị Object thể hiện các tài nguyên trên web.

Vấn đề nào JNDI giải quyết

Không có JNDI, vị trí hoặc thông tin truy cập của các tài nguyên từ xa sẽ phải được mã hóa cứng trong các ứng dụng hoặc được cung cấp trong cấu hình. Duy trì thông tin này là khá tẻ nhạt và dễ bị lỗi.

Ví dụ, nếu một tài nguyên đã được di chuyển trên một máy chủ khác, với một địa chỉ IP khác, tất cả các ứng dụng sử dụng tài nguyên này sẽ phải được cập nhật với thông tin mới này. Với JNDI, điều này là không cần thiết. Chỉ ràng buộc tài nguyên tương ứng phải được cập nhật. Các ứng dụng vẫn có thể truy cập nó với tên của nó và việc di chuyển là trong suốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.