標籤:style blog http color os io 使用 java strong
一、JNDI 名詞解釋
JNDI 是Java 命名和目錄介面(Java Naming and Directory Interface,JNDI)的簡稱.從一開始就一直是 Java 2 平台企業版(JEE)的核心技術之一。在JMS,JMail,JDBC,EJB等技術中,就大量應用的這種技術。
命名服務:它提供了為給定的資料集建立一個標準名字的能力。它允許把名稱同Java對象或資源關聯起來,而不必指出對象或資源的物理ID。基本的名字操作包含在Context介面中。
目錄服務:目錄服務是一種特殊類型的資料庫,與SQL Server、Access、Oracle等關聯式資料庫管理系統相反,構造目錄服務的目的是為了處理基於行為的事務,並且使用一種關係資訊模型。基本的目錄服務操作包含在DirContext介面中。
JNDI 的架構與實現
JNDI 的服務提供者
一個服務提供者就是一組Java類的集合,它支援開發人員同目錄服務進行通訊,其方式類似於JDBC驅動程式與資料庫之間的通訊方式。能夠用於JNDI的服務提供者必須實現Context介面或Context的擴充介面Directory- Context。
在使用JNDI時,讀者只需要瞭解JNDI,而服務提供者才關注實際的網路通訊協定、編碼/解碼值等細節。
當下載SDK軟體開發包時,同時就下載了Sun公司的一些現有的服務提供者。這些服務提供者包括LDAP、NIS、COS(CORBA物件服務)、RMI註冊及檔案系統的提供者。如:hashtableObj.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.ldapCtx- Fatory")就是表示使用Sun LDAP服務提供者。當然如果要使用IBM服務提供者時就可以用com.ibm.jndi.LDAPCtxFatory來代替com.sun.jndi.ldap.ldapCtxFatory。
JNDI 的包
JNDI 包含5個包
· javax.naming:主要用於命名操作,它包含了命名服務的類和介面,該包定義了Context介面和InitialContext類;
· javax.naming.directory:主要用於目錄操作,它定義了DirContext介面和InitialDir- Context類;
· javax.naming.event:在命名目錄伺服器中請求事件通知;
· javax.naming.ldap:提供LDAP支援;
· javax.naming.spi:允許動態插入不同實現,為不同命名目錄服務供應商的開發人員提供開發和實現的途徑,以便應用程式通過JNDI可以訪問相關服務。
常用的 JNDI 操作
常用的JNDI操作如下:
void bind(String sName,Object object),綁定:把名稱同對象關聯的過程。 void rebind(String sName,Object object),重新綁定:用來把對象同一個已經存在的名稱重新綁定。一般使用rebind()而不使用bind(),因為當有重名的時候rebind()不會出現異常,而bind()會報異常。 void unbind(String sName),釋放:用來把對象從目錄中釋放出來。 void lookup(String sName,Object object),尋找:返回目錄總的一個對象。 void rename(String sOldName,String sNewName),重新命名:用來修改對象名稱綁定的名稱。 NamingEnumeration listBindings(String sName),清單:返回綁定在特定上下文中指定屬性名稱對象的清單列表,它返回名字、類和對象本身,它用於那些需要對
具體使用方式如下:
//得到初始目錄環境的一個引用Context cntxt = new InitialContext();//返回綁定在特定上下文中指定屬性名稱對象的清單列表NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");//迴圈列出所有名字、類和對象while ( namEnumList.hasMore() ) { Binding bnd = (Binding) namEnumList.next(); String sObjName = bnd.getName(); String sClassName = bnd.getClassName(); //得到對象 SomeObject objLocal = (SomeObject) bnd.getObject();}
NamingEnumeration list(String sName)與listBindings(String sName)相似,只是它只返回一系列名字/類映射,它主要是用於上下文瀏覽應用。
二、JNDI 配置
配置 JNDI 資源
複製 JBoss 文檔的資料庫引用的資料來源定義模板到 JBoss 伺服器。 $DOC_HOME/docs/examples/jca/mysql-ds.xml ---> $Server_HOME/server/default/deploy.
修改 mysql-ds.xml 檔案的內容,使之能通過JDBC正確訪問你的MySQL資料庫,如下:
<?xml version="1.0" encoding="UTF-8"?><datasources><local-tx-datasource> <jndi-name>MySqlDS</jndi-name> <connection-url>jdbc:mysql://localhost:3306/demo</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>
配置 JNDI 資源引用
為了讓 JNDI 解析 java:comp/env/jdbc/mydatasource
引用,必須把 <resource-ref>
標籤插入 web.xml 檔案(Web 應用程式的部署描述符)
<resource-ref>: 資源引用,一般聲明管理資源,如資料庫驅動程式、JavaMail 會話、自訂類工廠等。
<resource-env-ref>: 資源環境引用,在Servlet 2.4裡用來簡化設定不需認證資訊的資源環境,一般聲明與資源相關的被管理對象,如環境參數、resource-ref變數。
<resource-ref> <res-ref-name>jdbc/mydatasource</res-ref-name> <jndi-name>java:MySqlDS</jndi-name> // 指向真實的 JNDI name <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth></resource-ref>
<resource-ref>
入口告訴 servlet 容器,部署人員要在 組件命名內容(component naming context) 中設定一個叫做 jdbc/mydatasource
的資源。組件命名內容由首碼 java:comp/env/
表示,所以完整本地資源名稱是: java:comp/env/jdbc/mydatasource
.
使用 JNDI 得到資料來源
Connection conn=null;try { Context ctx=new InitialContext(); Object datasourceRef=ctx.lookup("java:comp/env/jdbc/mydatasource"); DataSource ds=(Datasource)datasourceRef; Connection c=ds.getConnection(); /* use the connection */ c.close();} catch(Exception e) { e.printStackTrace();} finally { if(conn!=null) { try { conn.close(); } catch(SQLException e) { } }}
外部資源連結:
JNDI 在 J2EE 中的角色
詳解JNDI的lookup資源引用java:/comp/env
tomcat下jndi的三種配置方式
Apache Tomcat 5.5 Servlet/JSP 容器
resource-ref和resource-env-ref
JNDI 配置:JBoss + MySQL