当前位置: 首页 > news >正文

InitialContext和lookup

为什么80%的码农都做不了架构师?>>>   hot3.png

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); 

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

分享到:   
load-on-startup的使用 |  java克隆入门和深入
  • 2010-06-01 13:53
  • 浏览 19438
  • 评论(2)
  • 分类:编程语言
  • 相关推荐
评论
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. }  

转载于:https://my.oschina.net/sbcagf/blog/782950

相关文章:

  • 转】Mahout分步式程序开发 聚类Kmeans
  • Python 查看QQ状态
  • 前端弹出层框架layer
  • expect的超时处理
  • 自定义QGraphicsItem
  • FZU-2087 统计树边(最小生成树)
  • 选购线PHPUnit最佳实践:从入门到精通
  • 日常小算法
  • Cacti 监控流入流出差并作阈值报警
  • 精通Web Analytics 2.0 (7) 第五章:荣耀之钥:度量成功
  • scapy框架安装和入门
  • python知识点记录(一):
  • jdk之jhat命令
  • 解读基于数加的大数据仓库解决方案
  • EBS_DBA_技能:常用SQL
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • iOS 颜色设置看我就够了
  • Less 日常用法
  • MD5加密原理解析及OC版原理实现
  • nodejs调试方法
  • php ci框架整合银盛支付
  • Python语法速览与机器学习开发环境搭建
  • React-Native - 收藏集 - 掘金
  • Spring核心 Bean的高级装配
  • Terraform入门 - 3. 变更基础设施
  • VuePress 静态网站生成
  • 简单实现一个textarea自适应高度
  • 简单易用的leetcode开发测试工具(npm)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 湖北分布式智能数据采集方法有哪些?
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #android不同版本废弃api,新api。
  • #Java第九次作业--输入输出流和文件操作
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $.ajax()
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二)windows配置JDK环境
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (十六)串口UART
  • (四)模仿学习-完成后台管理页面查询
  • (五)Python 垃圾回收机制
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net core控制台应用程序初识
  • .net mvc部分视图
  • .NET MVC第三章、三种传值方式