zoukankan      html  css  js  c++  java
  • InitialContext和lookup

    http://wxg6203.iteye.com/blog/680830 

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

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

    Java代码 
    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); 

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

    分享到:  
    评论
    2 楼 surpassno 2013-08-29  
    1 楼 ybzshizds 2010-08-06  
    这种用工厂模式解决的办法其实还是有一个问题,就是ejb容器重启后,客户端应该也要重新去new InitialContext,否则用原来的InitialContext去lookup,会抛出错。

    想想后,我是这样去解决的。

    为每个ejbhome,新建一个ejbHelper类

    如:

    Java代码  收藏代码
    1. package com.company.vas.ejb.helper;  
    2.   
    3. import java.rmi.RemoteException;  
    4.   
    5. import javax.ejb.CreateException;  
    6. import javax.naming.NamingException;  
    7.   
    8. import com.company.util.Log;  
    9. import com.company.vas.ejb.Invoice;  
    10. import com.company.vas.ejb.home.InvoiceHome;  
    11.   
    12. public class InvoiceHelper {  
    13.   
    14.     private static final String CLASS_NAME = "InvoiceHelpler";  
    15.     private static InvoiceHome home;  
    16.   
    17.     public static Invoice getInvoice() {  
    18.     try {  
    19.         if (home == null) {  
    20.         home = (InvoiceHome) EjbGetter.getEJBHome(  
    21.                         IInvoice.JNDI_NAME, InvoiceHome.class);  
    22.          }  
    23.          return home.create();  
    24.     } catch (NamingException e) {  
    25.             Log.error(CLASS_NAME, "getInvoice()", e.getMessage());  
    26.             home = null;  
    27.     } catch (RemoteException e) {  
    28.             Log.error(CLASS_NAME, "getInvoice()", e.getMessage());  
    29.             home = null;  
    30.     } catch (CreateException e) {  
    31.             Log.error(CLASS_NAME, "getInvoice()", e.getMessage());  
    32.             home = null;  
    33.     }  
    34.        return null;  
    35.     }  
    36. }  
    37.   
    38.   
    39. package com.company.vas.ejb.helper;  
    40.   
    41. import java.util.Properties;  
    42.   
    43. import javax.ejb.EJBHome;  
    44. import javax.naming.Context;  
    45. import javax.naming.InitialContext;  
    46. import javax.naming.NamingException;  
    47.   
    48. public class EjbGetter {  
    49.   
    50.     public static EJBHome getEJBHome(String service_jndiname, Class homeInterface) throws NamingException{  
    51.         Properties env = new Properties();  
    52.         env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");  
    53.         env.put(Context.PROVIDER_URL, "192.168.60.120:1099");  
    54.         env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");  
    55.       
    56.         Context ic = new InitialContext(env);  
    57.         EJBHome ejbHome = (EJBHome)javax.rmi.PortableRemoteObject.narrow(ic.lookup(service_jndiname), homeInterface);  
    58.           
    59.         return ejbHome;  
    60.     }  
    61. }  
  • 相关阅读:
    iOS实时查看App运行日志
    Jmeter-使用Ultimate Thread Group插件来设置负载场景
    Flask使用Flask-SQLAlchemy操作MySQL数据库
    使用requests库提交multipart/form-data 格式的请求
    spark 性能调优(一) 性能调优的本质、spark资源使用原理、调优要点分析
    一、spark错误
    sqoop 补充
    Hbase—— rowkey 过滤器(rowfilter)
    spark 调优——基础篇
    scala 的安装 与 IDEA安装使用
  • 原文地址:https://www.cnblogs.com/clds/p/5081682.html
Copyright © 2011-2022 走看看