InitialContext和lookup

原文地址:http://wxg6203.iteye.com/blog/680830

最近因为工作需要开始学习Ejb3,遇到了一个让我很郁闷的事情,做一下小小的总结——小心new InitialContext()。

在做客户端的时候,发现连接服务器,搜索数据库,然后返回结果集。每一次执行的时候,第一次总要花更多的时间,之后每一次操作时间就要快很多了。期间找了很多方法,都行不通。一开始以为是Ejb服务器建立服务消耗时间,后来觉得不对,因为Jboss启动的时候,已经将服务启动了。经过一周的排查,终于发现原来是因为new InitialContext()消耗了大量的时间,之后的lookup()方法也会消耗一定的时间。其中,在网络状态良好的情况下,每一次new InitialContext()方法花费大概100毫秒到200毫秒之间,而每一次lookup()大概要花10毫秒到30毫秒之间。因此,决定对代码进行优化,创建了EJBHomeFactory工具类,使用到了单例模式,欢迎大家指教。以下为该类代码:

import javax.naming.InitialContext;   

import javax.naming.NamingException;   

  

import com.cithinc.util.Tool;   

  

public class EJBHomeFactory {   

    private static EJBHomeFactory instance;   

    private InitialContext context;   

  

    private EJBHomeFactory() throws NamingException {   

        context = Tool.getInitialContext();   

    }   

  

    public static EJBHomeFactory getInstance() throws NamingException {   

        if (instance == null) {   

            instance = new EJBHomeFactory();   

        }   

        return instance;   

    }   

  

    public Object lookup(String jndiName) throws NamingException {   

        Object obj = new Object();   

        obj = context.lookup(jndiName);   

        return obj;   

    }   

}  



import javax.naming.InitialContext; 

import javax.naming.NamingException; 



import com.cithinc.util.Tool; 



public class EJBHomeFactory { 

private static EJBHomeFactory instance; 

private InitialContext context; 



private EJBHomeFactory() throws NamingException { 

context = Tool.getInitialContext(); 

} 



public static EJBHomeFactory getInstance() throws NamingException { 

if (instance == null) { 

instance = new EJBHomeFactory(); 

} 

return instance; 

} 



public Object lookup(String jndiName) throws NamingException { 

Object obj = new Object(); 

obj = context.lookup(jndiName); 

return obj; 

} 

} 



其中,Tool.java的文件内容如下: 



Java代码 

import java.util.Hashtable;   

  

import javax.naming.Context;   

import javax.naming.InitialContext;   

import javax.naming.NamingException;   

  

public class Tool {   

    @SuppressWarnings("unchecked")   

    public static InitialContext getInitialContext() throws NamingException {   

        Hashtable environment = new Hashtable();   

        environment.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");   

        environment.put(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");   

        environment.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099");   

        return new InitialContext(environment);   

    }   

}  



import java.util.Hashtable; 



import javax.naming.Context; 

import javax.naming.InitialContext; 

import javax.naming.NamingException; 



public class Tool { 

@SuppressWarnings("unchecked") 

public static InitialContext getInitialContext() throws NamingException { 

Hashtable environment = new Hashtable(); 

environment.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory"); 

environment.put(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces"); 

environment.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); 

return new InitialContext(environment); 

} 

} 







然后这样调用: 



Java代码 

EJBHomeFactory f = EJBHomeFactory.getInstance();   

Object o = f.lookup(remote);  



EJBHomeFactory f = EJBHomeFactory.getInstance(); 

Object o = f.lookup(remote); 



这样就可以保证只初始化一次上下文实例,节省大量的时间。 

 

你可能感兴趣的:(context)