JNDI là gì? Cách sử dụng JNDI trong Java

JNDI, viết tắt của Java Naming and Directory Interface, là một API được sử dụng 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 Java. Được thiết kế dành riêng cho nền tảng Java, JNDI cho phép các ứng dụng Java lưu trữ và truy xuất các đối tượng Java theo tên. Ngoài ra, JNDI cung cấp các phương thức cho việc liên kết thuộc tính với đối tượng và tìm kiếm đối tượng theo các thuộc tính của chúng.

JNDI độc lập với các dịch vụ đặt tên và thư mục cụ thể, cho phép các ứng dụng truy cập vào các dịch vụ thư mục, đặt tên và thư mục khác nhau qua một API chung. Các nhà cung cấp dịch vụ đặt tên và thư mục khác nhau có thể được tích hợp với API chung này. Điều này cho phép các ứng dụng Java tận dụng thông tin từ nhiều dịch vụ đặt tên và thư mục hiện có như LDAP, NDS, DNS và NIS (YP), và tồn tại song song với các hệ thống và phần mềm cũ.

Có Thể Bạn Quan Tâm :   Viết tắt tiếng Anh là gì?

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

Kiến trúc JNDI

Kiến trúc JNDI bao gồm một API và một SPI (Service Provider Interface). Các ứng dụng Java sử dụng JNDI API để sử dụng chức năng đặt tên và thư mục. Lưu ý rằng JNDI chỉ là một giao diện quy định các phương thức, vì vậy chúng ta cần một nhà cung cấp JNDI triển khai các phương thức này. SPI cho phép chúng ta linh hoạt sử dụng các nhà cung cấp JNDI như LDAP, DNS, NIS, v.v.

kiến trúc JNDI

Dưới đây là một số nhà cung cấp JNDI phổ biến:

  • Lightweight Directory Access Protocol (LDAP)
  • Common Object Request Broker Architecture (CORBA) Common Object Services (COS) name service
  • Java Remote Method Invocation (RMI) Registry
  • Domain Name Service (DNS)
Có Thể Bạn Quan Tâm :   iPhone quốc tế là gì? Phân biệt các loại iPhone trên thị trường

Trường hợp sử dụng JNDI phổ biến

Một trường hợp sử dụng phổ biến của JNDI 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 triển khai trên máy chủ đó có thể truy cập vào kết nối mà họ cần thông qua tên JNDI “java:comp/env/FooBarPool” mà không cần biết chi tiết về kết nối.

Việc sử dụng JNDI trong trường hợp này có một số lợi ích:

  1. Nếu bạn có một quy trình triển khai trong đó các ứng dụng di chuyển từ môi trường devl->int->test->prod, bạn có thể sử dụng cùng tên JNDI trong mỗi môi trường và ẩn thông tin về cơ sở dữ liệu thực tế đang được sử dụng. Các ứng dụng không cần thay đổi khi di chuyển giữa các môi trường.
  2. Bạn có thể giảm 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 phẩm. Chỉ máy chủ ứng dụng Java EE cần biết rằng bạn đang sử dụng JNDI.
Có Thể Bạn Quan Tâm :   Amulec Là Gì – Upcom Index Là Gì – WEB GIẢI ĐÁP

Giao diện Name

Giao diện Name cung cấp cơ chế quản lý tên và cú pháp cho JNDI. Phần đầu tiên trong chuỗi trước dấu / đại diện cho context toàn cục, trong khi các phần sau đại diện cho các sub-context.

Ví dụ:

import javax.naming.CompositeName;
import javax.naming.InvalidNameException;
import javax.naming.Name;
import java.util.Enumeration;

class Main {
    public static void main(String[] args) throws InvalidNameException {
        Name objectName = new CompositeName("java:comp/env/jdbc");
        Enumeration elements = objectName.getAll();
        while (elements.hasMoreElements()) {
            System.out.println(elements.nextElement());
        }
    }
}

Kết quả:

java:compenvjdbc

Giao diện Context

Giao diện Context chứa các thuộc tính của dịch vụ đặt tên và thư mục. Dưới đây là ví dụ về việc sử dụng Context trong Spring.

SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.activate();

JndiTemplate jndiTemplate = new JndiTemplate();
Context ctx = (Context) jndiTemplate.getContext();

Binding và Lookup

Sau khi tạo thành công SimpleNamingContextBuilder, chúng ta có thể lưu trữ JDBC Datasource thông qua phương thức bind().

ds = new DriverManagerDataSource("jdbc:h2:mem:mydb");
ctx.bind("java:comp/env/jdbc/datasource", ds);

Sau khi đưa ra liên kết thành công, chúng ta có thể truy xuất lại thông qua phương thức lookup.

DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");

Tham khảo:

https://stackoverflow.com/questions/1350816/what-is-the-purpose-of-jndi

https://docs.oracle.com/javase/jndi/tutorial/getStarted/overview/index.html

https://www.baeldung.com/jndi

Back to top button