叢集jndi實作了高可靠性jndi,通過伺服器的叢集,保證了jndi的負載平衡和錯誤恢複。在全局共享的方式下,叢集中的一個應用伺服器保證本地jndi樹的獨立性,并擁有全局的jndi樹。每個應用伺服器在把部署的服務對象綁定到自己本地的jndi樹的同時,還綁定到一個共享的全局jndi樹,實作全局jndi和自身jndi的聯系。
jndi(javanaming and directory interface)是一個應用程式設計的api,為開發人員提供了查找和通路各種命名和目錄服務的通用、統一的接口,類似jdbc都是建構在抽象層上。現在jndi已經成為j2ee的标準之一,所有的j2ee容器都必須提供一個jndi的服務。
jndi可通路的現有的目錄及服務有:
dns、xnam 、novell目錄服務、ldap(lightweight directory access protocol輕型目錄通路協定)、 corba對象服務、檔案系統、windows xp/2000/nt/me/9x的系統資料庫、rmi、dsml v1&v2、nis。
jndi是一種查找服務,用于查找:
web應用環境變量
ejbs和他們的環境變量
jms目标和連接配接工廠
備注:不要講jndi當做資料庫使用,因為jdni對象存儲在記憶體中,通路jdni對象與網絡性能有關(網絡好的時候查找性能高)。
java.naming.factory.initial=org.jnp.interfaces.namingcontextfactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
備注:jndi.properties檔案為所有的initialcontexts設定預設的屬性,jndi.properties檔案的搜尋次序
·classpath
·$java_home/lib
·lookup()從jndi樹擷取對象
//執行個體化一個initialcontext對象
initialcontext ctx = new initialcontext();
//在jndi樹上查找“usermanagerbean對象
usermanager usermanager =(usermanager)ctx.lookup("usermanagerbean/remote");
user user = new user();
user.setusername("cody");
user.setpossword("0909");
//使用查找到對象的方法
usermanager.adduser(user);
//連接配接完成之後關閉通路資源
ctx.close();
·綁定到遠端命名服務的對象必須是序列化的
·通路命名服務時,對象是采用複制機制
ejb通過@remote注解将對象綁定到jndi樹上
@stateless
@remote(usermanager.class)
public classusermanagerbean implements usermanager {
@override
public void adduser(user user) {
system.out.println("user[username="+user.getusername()+"]已經被成功儲存");
user.setid(10);
}
}
jndi可能出現的異常
·authenticationexception
沒有提供認證資訊,或者提供的認證資訊有誤
·communicationexception
通信異常
·invalidnameexception
非法命名之類的異常
·namenotfoundexception
沒有找到相應名稱的資源
·noinitialcontextexception
沒有初始化initialcontext對象
j2ee規範要求所有 j2ee 容器都要提供 jndi 規範的實作。jndi 在 j2ee 中的角色就是“交換機” —— j2ee 元件在運作時間接地查找其他元件、資源或服務的通用機制。在多數情況下,提供 jndi 供應者的容器可以充當有限的資料存儲,這樣管理者就可以設定應用程式的執行屬性,并讓其他應用程式引用這些屬性(java 管理擴充(java managementextensions,jmx)也可以用作這個目的)。jndi 在 j2ee 應用程式中的主要角色就是提供間接層,這樣元件就可以發現所需要的資源,而不用了解這些間接性。
在 j2ee 中,jndi 是把 j2ee 應用程式合在一起的粘合劑,jndi 提供的間接尋址允許跨企業傳遞可伸縮的、功能強大且很靈活的應用程式。這是 j2ee 的承諾,而且經過一些計劃和預先考慮,這個承諾是完全可以實作的。