熟悉個jndi的概念

bulletming發表於2019-01-09

JNDI

JNDI(Java Naming and Directory Interface)是一個應用程式設計的API,為開發人員提供了查詢和訪問各種命名和目錄服務的通用、統一的介面,類似JDBC都是構建在抽象層上。
JNDI可訪問的現有的目錄及服務有:
DNS、XNam 、Novell目錄服務、LDAP(Lightweight Directory Access Protocol 輕型目錄訪問協議)、 CORBA物件服務、檔案系統、Windows XP/2000/NT/Me/9x的登錄檔、RMI、DSML v1&v2、NIS。
JNDI優點:
包含了大量的命名和目錄服務,使用通用介面來訪問不同種類的服務;
可以同時連線到多個命名或目錄服務上;
建立起邏輯關聯,允許把名稱同Java物件或資源關聯起來,而不必指導物件或資源的物理ID。
JNDI程式包:

javax.naming:命名操作;
javax.naming.directory:目錄操作;
javax.naming.event:在命名目錄伺服器中請求事件通知;
javax.naming.ldap:提供LDAP支援;
javax.naming.spi:允許動態插入不同實現。

利用JNDI的命名與服務功能來滿足企業級APIs對命名與服務的訪問,諸如EJBs、JMS、JDBC 2.0以及IIOP上的RMI透過JNDI來使用CORBA的命名服務。
JNDI與JDBC:
JNDI提供了一種統一的方式,可以用在網路上查詢和訪問服務。透過指定一個資源名稱,該名稱對應於資料庫或命名服務中的一個紀錄,同時返回資料庫連線建立所必須的資訊。
程式碼示例:

try{
Context cntxt = new InitialContext();
DataSource ds = (DataSource) cntxt.lookup("jdbc/dpt");
}
catch(NamingException ne){
...
}

JNDI與JMS:
訊息通訊是軟體元件或應用程式用來通訊的一種方法。JMS就是一種允許應用程式建立、傳送、接收、和讀取訊息的JAVA技術。
程式碼示例:

try{
Properties env = new Properties();
InitialContext inictxt = new InitialContext(env);
TopicConnectionFactory connFactory = (TopicConnectionFactory) inictxt.lookup("TTopicConnectionFactory");
...
}
catch(NamingException ne){
...
}

訪問特定目錄:舉個例子,人是個物件,他有好幾個屬性,諸如這個人的姓名、電話號碼、電子郵件地址、郵政編碼等屬性。透過getAttributes()方法


Attribute attr =
directory.getAttributes(personName).get("email");
String email = (String)attr.get();

透過使用JNDI讓客戶使用物件的名稱或屬性來查詢物件:

foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);

透過使用JNDI來查詢諸如印表機、資料庫這樣的物件,查詢印表機的例子:

Printer printer = (Printer)namespace.lookup(printerName);
printer.print(document);

瀏覽名稱空間:

NamingEnumeration list = namespace.list("o=Widget, c=US");
while (list.hasMore()) {
NameClassPair entry = (NameClassPair)list.next();
display(entry.getName(), entry.getClassName());
}

常用的JNDI操作:

void bind(String sName,Object object);――繫結:把名稱同物件關聯的過程
void rebind(String sName,Object object);――重新繫結:用來把物件同一個已經存在的名稱重新繫結
void unbind(String sName);――釋放:用來把物件從目錄中釋放出來
void lookup(String sName,Object object);――查詢:返回目錄中的一個物件
void rename(String sOldName,String sNewName);――重新命名:用來修改物件名稱繫結的名稱
NamingEnumeration listBinding(String sName);――清單:返回繫結在特定上下文中物件的清單列表
NamingEnumeration list(String sName);

程式碼示例:重新得到了名稱、類名和繫結物件。

NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");
...
while ( namEnumList.hasMore() )   {
Binding bnd = (Binding) namEnumList.next();
String sObjName = bnd.getName();
String sClassName = bnd.getClassName();
SomeObject bjLocal = (SomeObject) bnd.getObject();
}

JNDI連線資料庫模型


package DBUtil;

import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;

public class DBConnection {
private Connection conn = null;
private Statement stmt = null;
private ResultSet rs = null;
private int resultNum = 0;

/**
* 建構函式
* 找到資料來源,並用這個資料來源建立連線
*/
public DBConnection() {
  try {
    Context ctx = new InitialContext();
if (ctx == null) throw new Exception("No Context");
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oracle");
    if (ds == null) throw new Exception("jdbc/oracle is an unknown DataSource");
    conn = ds.getConnection();
    stmt = conn.createStatement();
  } catch (Exception e) {
    System.out.println("naming:" + e.getMessage());
  }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82392/viewspace-152687/,如需轉載,請註明出處,否則將追究法律責任。

相關文章