JNDI(Java Naming and Directory Interface,Java 命名與目錄接口) 是 J2EE 規範中的核心服務之一。許多專家認為:若未透徹理解 JNDI 的意義與作用,便無法真正掌握 J2EE——特別是 EJB 的精髓。
早期開發資料庫應用時,程式碼中直接寫死 JDBC 驅動類、URL、帳號密碼:
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver", true, Thread.currentThread().getContextClassLoader());
conn = DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
// 執行 SQL 操作...
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) try { conn.close(); } catch (SQLException ignored) {}
}
核心思想:將「資源配置與管理」交給 J2EE 容器,程式只需透過「邏輯名稱」查找引用。開發者無需關心具體的 JDBC 驅動、URL、憑證、連接池參數,只需在程式中查找資料源名稱即可。
mysql-ds.xml<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>MySQLDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/lw</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>rootpassword</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>MySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
此處定義邏輯名稱 MySQLDS,封裝所有連線細節。
Connection conn = null;
try {
Context ctx = new InitialContext();
Object datasourceRef = ctx.lookup("java:MySQLDS"); // 查找邏輯名稱
DataSource ds = (DataSource) datasourceRef;
conn = ds.getConnection(); // 獲取連線,無感知底層細節
// 執行 SQL 操作...
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) try { conn.close(); } catch (SQLException ignored) {}
}
mysql-ds.xml 即可變更連線參數,無需重新編譯部署應用;JNDI 在 J2EE 中扮演「交換機」角色,支援多種資源引用:
env-entry 字串、數值等配置參數;這使得 J2EE 應用能跨企業交付可擴展、靈活的架構——JNDI 是將 J2EE 組件「粘合」在一起的關鍵膠水。
JNDI 為 Java 應用提供統一 API,透過同一介面訪問 DNS、LDAP、RMI Registry、COS Naming 等異構命名/目錄服務。
參考延伸閱讀:
JNDI 核心原理與實戰(一)
JNDI 核心原理與實戰(二)