InitialContext和lookup

最近因为工作需要开始学习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);

这样就可以保证只初始化一次上下文实例,节省大量的时间。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值