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

这样就可以保证只初始化一次上下文实例,节省大量的时间。 
时间: 2024-10-02 01:22:20

InitialContext和lookup(转)的相关文章

InitialContext和lookup

http://wxg6203.iteye.com/blog/680830 最近因为工作需要开始学习Ejb3,遇到了一个让我很郁闷的事情,做一下小小的总结——小心new InitialContext(). 在做客户端的时候,发现连接服务器,搜索数据库,然后返回结果集.每一次执行的时候,第一次总要花更多的时间,之后每一次操作时间就要快很多了.期间找了很多方法,都行不通.一开始以为是Ejb服务器建立服务消耗时间,后来觉得不对,因为Jboss启动的时候,已经将服务启动了.经过一周的排查,终于发现原来是因

InitialContext与lookup

Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter"); 一般情况下,intial.lookup("")中的参数就是你的JNDI名称.但是用的应用服务器,是把JNDI名放到java:comp/env/ejb/后面的.两种方式都没有错.比如: TomCat5.0中使用的是Object objref = init

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 lookup is between the same Server: java.lang.ClassCastException: org.jboss.ejb.client.naming.ejb.EjbNamingContext cannot be cast to com.transaction.IT

J2EE--EJB

一.EJB基础: EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序.凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台.EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准.其特点包括网络服务支持和核心开发工具(SDK). 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bea

Java命名和目录接口——JNDI

JNDI即Java命名和目录接口(JavaNaming and Directory Interface),它属于J2EE规范范畴,是J2EE的核心技术之一,提供了一组接口.类和关于命名空间的概念.JDNI是provider-based技术,它暴露一个API和一个服务供应接口(SPI).它将名称和对象联系起来,使我们可以用名称访问对象.我们可以把JNDI简单地看成是里面封装了一个name到实体对象的映射,通过字符串可以方便得到想要的对象资源,例如JDBC.JMail.JMS.EJB等.这意味着任何

再说JNDI

说到JNDI,即熟悉又陌生,熟悉在经常使用,如EJB3.0中的@EJB注入,底层实现即是JNDI的方式:喜闻乐见的: Context ctx=new InitialContext(); Object obj=(Object)ctx.lookup("java:comp/env/XXX"); 更是最常用的方式.说它陌生,是因为,对于JNDI,我们仅限于基本的使用,本文就是带领大家进入JNDI分析阶段. JNDI作用 以数据源为例. 未使用JNDI 如果我们没有使用JNDI,代码如下 Con

Java web----Tomcat配置连接池

1 Tomcat配置JNDI资源 JNDI(Java Naming and Directory Interface),Java命名和目录接口.JNDI的作用就是:在服务器上配置资源,然后通过统一的方式来获取配置的资源. 我们这里要配置的资源当然是连接池了,这样项目中就可以通过统一的方式来获取连接池对象了. 配置JNDI资源需要到<Context>元素中配置<Resource>子元素: name:指定资源的名称,这个名称可以随便给,在获取资源时需要这个名称: factory:用来创建

连接池的复习

数据库连接池的概念 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection(因为连接池对Connection使用了装饰模式),而是把Connection“归还”给池.池就可以再利用这个Connection对象了. JDBC数据库连接池接口(DataSource) Java为数据库

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

Class loading in AS7 is considerably different to previous versions of JBoss AS. Class loading is based on the JBoss Modules project. Instead of the more familiar hierarchical class loading environment, AS7's class loading is based on modules that ha