JNDI_小结

来源:互联网 发布:下载genbank数据库 编辑:程序博客网 时间:2024/05/24 01:21

JNDI产生背景


访问数据库时,需要对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");/* use the connection */......conn.close();}catch(Exception e) {e.printStackTrace();}finally {if(conn!=null) {try {conn.close();} catch(SQLException e) {}}}

但是在生产环境中,部署程序变得复杂,需要在不改变代码的情况下更改这些配置参数。于是乎,将配置信息存放在一个数据源文件中,代码就可以从中解耦。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) { }  }}

同时,随着分布式应用的发展,远程访问对象访问成为常用的方法。虽然说通过Socket等编程手段仍然可实现远程通信,但按照模式的理论来说,仍是有其局限性的。RMI技术,RMI-IIOP技术的产生,使远程对象的查找成为了技术焦点。JNDI技术的产生,就可方便的查找远程或是本地对象。

JDNI与远程资源


命名服务是将名称与对象进行绑定。一组这样的绑定被称为上下文,Jndi上下文可以用来查找,捆绑/解除捆绑,创建或者破坏绑定名称操作在JNDI中,上下文是使用javax.naming.Context 接口来表示的,而这个接口也正是与命名服务进行交互的主要接口。
Context 接口中的每个命名方法都有两种重载的形式:
  • lookup(String name): 接受一个字符串名称参数,查找绑定远程对象。
  • lookup(javax.naming.Name): 接受一个结构化的名称,查找绑定远程对象。

InitialContext 是一个实现了 Context接口的类。使用这个类作为命名服务的入口点 。创建一个InitialContext 对象构造器需要采用一组属性,形式为java.util.Hashtable 或其子类之一,比如:

Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
InitialContext = new InitialContext(props);

要通过JNDI 进行资源访问,我们必须设置初始化上下文的参数,主要是设置JNDI 驱动的类名(java.naming.factory.initial)和提供命名服务的URL(java.naming.provider.url)。因为Jndi 的实现产品有很多。所以java.naming.factory.initial 的值因提供JNDI 服务器的不同而不同,java.naming.provider.url 的值包括提供命名服务的主机地址和端口号

下表列出了用于所支持的服务提供程序的工厂类
名称
服务提供程序工厂
文件系统
com.sun.jndi.fscontext.RefFSContextFactory
LDAP
com.sun.jndi.ldap.LdapCtxFactory
RMI
com.sun.jndi.rmi.registry. RegistryContextFactory
CORBA
com.sun.jndi.cosnaming.CNCtxFactory
DNS
com.sun.jndi.dns.DnsContextFactory



JNDI与远程对象(RMI)


简单来说,即远程先注册,本地调用。

远程代码:
package com.itjob.rmi;
import java.rmi.*;
import java.rmi.registry.*;
import javax.naming.*;
public class RmiSampleServerJndi{
public static void main(String[] args) throws Exception{
LocateRegistry.createRegistry(8808);
RmiSampleImpl server=new RmiSampleImpl(); System.setProperty(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");
System.setProperty(Context.PROVIDER_URL,"rmi://localhost:8808");
InitialContext ctx=new InitialContext();
ctx.bind("java:comp/env/SampleDemo",server);
ctx.close();
}
}

本地代码:
package com.itjob.rmi;
import java.rmi.*;
import java.rmi.server.*;
import javax.naming.*;
public class RmiSampleClientJndi {
public static void main(String[] args) throws Exception
{
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");
System.setProperty(Context.PROVIDER_URL,"rmi://localhost:8808");
InitialContext ctx=new InitialContext();
String url = "java:comp/env/SampleDemo";
RmiSample RmiObject = (RmiSample)ctx.lookup(url);
System.out.println(" 1 + 2 = " + RmiObject.sum(1,2) );
}
}















1 0
原创粉丝点击