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类

如:

  1. package com.company.vas.ejb.helper;
  2. import java.rmi.RemoteException;
  3. import javax.ejb.CreateException;
  4. import javax.naming.NamingException;
  5. import com.company.util.Log;
  6. import com.company.vas.ejb.Invoice;
  7. import com.company.vas.ejb.home.InvoiceHome;
  8. public class InvoiceHelper {
  9. private static final String CLASS_NAME = "InvoiceHelpler";
  10. private static InvoiceHome home;
  11. public static Invoice getInvoice() {
  12. try {
  13. if (home == null) {
  14. home = (InvoiceHome) EjbGetter.getEJBHome(
  15. IInvoice.JNDI_NAME, InvoiceHome.class);
  16. }
  17. return home.create();
  18. } catch (NamingException e) {
  19. Log.error(CLASS_NAME, "getInvoice()", e.getMessage());
  20. home = null;
  21. } catch (RemoteException e) {
  22. Log.error(CLASS_NAME, "getInvoice()", e.getMessage());
  23. home = null;
  24. } catch (CreateException e) {
  25. Log.error(CLASS_NAME, "getInvoice()", e.getMessage());
  26. home = null;
  27. }
  28. return null;
  29. }
  30. }
  31. package com.company.vas.ejb.helper;
  32. import java.util.Properties;
  33. import javax.ejb.EJBHome;
  34. import javax.naming.Context;
  35. import javax.naming.InitialContext;
  36. import javax.naming.NamingException;
  37. public class EjbGetter {
  38. public static EJBHome getEJBHome(String service_jndiname, Class homeInterface) throws NamingException{
  39. Properties env = new Properties();
  40. env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
  41. env.put(Context.PROVIDER_URL, "192.168.60.120:1099");
  42. env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
  43. Context ic = new InitialContext(env);
  44. EJBHome ejbHome = (EJBHome)javax.rmi.PortableRemoteObject.narrow(ic.lookup(service_jndiname), homeInterface);
  45. return ejbHome;
  46. }
  47. }

InitialContext和lookup的更多相关文章

  1. InitialContext和lookup(转)

    原文地址:http://wxg6203.iteye.com/blog/680830 最近因为工作需要开始学习Ejb3,遇到了一个让我很郁闷的事情,做一下小小的总结——小心new InitialCont ...

  2. InitialContext与lookup

    Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/Simpl ...

  3. Jboss7.1 local EJB lookup problem

    We are trying to lookup for an Local EJB in JBoss7.1, but we get an ClassCast Exception. This local ...

  4. Class loading in JBoss AS 7--官方文档

    Class loading in AS7 is considerably different to previous versions of JBoss AS. Class loading is ba ...

  5. 浅谈JNDI的使用

    原文:http://www.weicoop.com/web/article/52.html 关于什么是JNDI的概念这里不做解释,本文作为初学者根据所了解到内容做些总结,主要内容如下: 1.JNDI使 ...

  6. JNDI support differences between Tibco EMS and ActiveMQ

    Introduction Recently our team was working on Veracity Quick Start sprint, when I was trying to migr ...

  7. 再说JNDI

    说到JNDI,即熟悉又陌生,熟悉在常常使用,如EJB3.0中的@EJB注入,底层实现即是JNDI的方式:喜闻乐见的: Context ctx=new InitialContext(); Object ...

  8. java_web学习(12)JDBC

    数据持久化       持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的 ...

  9. Java命名和目录接口——JNDI

    JNDI即Java命名和目录接口(JavaNaming and Directory Interface),它属于J2EE规范范畴,是J2EE的核心技术之一,提供了一组接口.类和关于命名空间的概念.JD ...

随机推荐

  1. Android 更新UI的两种方法——handler和runOnUiThread()

    今天看到了一个runOnUiThread()方法用来更新UI,觉得很神奇!! 方法一:handler机制不说了. 方法二:利用Activity.runOnUiThread(Runnable)把更新ui ...

  2. centos从头学习配置web服务器环境

    为了学习linux下配置web服务器环境,于是安装了vmware,准备在虚拟机里面学习web服务器的搭建! 首先是在虚拟机里安装centos,我选择的是32位的centos6.6版本,因为新版本7据说 ...

  3. 资源相互引用时 需添加 PerformSubstitution=True

    获取或设置一个布尔值,该值确定在对由 WebResourceAttribute 类引用的嵌入式资源的处理过程中是否分析其他 Web 资源 URL,并用到该资源的完整路径替换. 如:一个CSS文件引用其 ...

  4. session的作用范围(转)

    session是在服务器端建立的,浏览器访问服务器会有一个jsessionid,浏览器端通过 jsessionid定位服务器端的session,session的创建和销毁由服务器端控制.当浏览器关闭后 ...

  5. DevExpress控件之popupMenu

    一.首次创建 1.可直接从工具栏拉一个PopupMenu出来, 2.右键Customize,Yes(提示是否自动创建BarManager,并为popupmenu绑定这个BarManager): 3.编 ...

  6. javascript - 封装jsonp

    jsonp牵扯到同源策略.跨域等问题,这里不细说了. 实现就是创建动态的script标签来请求后台地址: 示例: jsonp('xxx.php', { uid: 1 }, function (res) ...

  7. 【Excle】8个快捷键

    1.CtrL+ F1 一键切换功能区是否显示,几乎每天都要用N次. 2.Ctrl + N 一键插入新的工作簿,再不用通过新建 - 空白工作簿来操作了. 3.Shift + F2 如果单元格中没有批注会 ...

  8. JavsScript中DOM的基本操作

    节点及其类型 元素节点 属性节点: 元素的属性, 可以直接通过属性的方式来操作. 文本节点: 是元素节点的子节点, 其内容为文本. 在 html 文档的什么位置编写 js 代码 直接在 html 页面 ...

  9. zabbix web monitoring 监控网页

    配置 Web 场景 配置 web 场景: 转到: 配置 (Configuration)–>主机 (或者 模板 ) 点击主机 (host)/ 模板 (template) 行中的 Web 点击右上角 ...

  10. ubuntu安装firefox的flash插件

    1.下载插件 https://get.adobe.com/cn/flashplayer/ 下载tar.gz文件 2.解压缩 切换到下载目录,如果是默认下载的话,用 cd ~/下载/解压缩下载的文件 t ...