首页 > 学院 > 开发设计 > 正文

InitialContext和lookup(转)

2019-11-14 22:42:18
字体:
来源:转载
供稿:网友
InitialContext和lookup(转)

原文地址:http://wxg6203.VEvb.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); 这样就可以保证只初始化一次上下文实例,节省大量的时间。 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表