InitialContext和lookup
2015-12-28 10:06
211 查看
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代码
package com.company.vas.ejb.helper;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.naming.NamingException;
import com.company.util.Log;
import com.company.vas.ejb.Invoice;
import com.company.vas.ejb.home.InvoiceHome;
public class InvoiceHelper {
private static final String CLASS_NAME = "InvoiceHelpler";
private static InvoiceHome home;
public static Invoice getInvoice() {
try {
if (home == null) {
home = (InvoiceHome) EjbGetter.getEJBHome(
IInvoice.JNDI_NAME, InvoiceHome.class);
}
return home.create();
} catch (NamingException e) {
Log.error(CLASS_NAME, "getInvoice()", e.getMessage());
home = null;
} catch (RemoteException e) {
Log.error(CLASS_NAME, "getInvoice()", e.getMessage());
home = null;
} catch (CreateException e) {
Log.error(CLASS_NAME, "getInvoice()", e.getMessage());
home = null;
}
return null;
}
}
package com.company.vas.ejb.helper;
import java.util.Properties;
import javax.ejb.EJBHome;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EjbGetter {
public static EJBHome getEJBHome(String service_jndiname, Class homeInterface) throws NamingException{
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "192.168.60.120:1099");
env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
Context ic = new InitialContext(env);
EJBHome ejbHome = (EJBHome)javax.rmi.PortableRemoteObject.narrow(ic.lookup(service_jndiname), homeInterface);
return ejbHome;
}
}
最近因为工作需要开始学习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代码
package com.company.vas.ejb.helper;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.naming.NamingException;
import com.company.util.Log;
import com.company.vas.ejb.Invoice;
import com.company.vas.ejb.home.InvoiceHome;
public class InvoiceHelper {
private static final String CLASS_NAME = "InvoiceHelpler";
private static InvoiceHome home;
public static Invoice getInvoice() {
try {
if (home == null) {
home = (InvoiceHome) EjbGetter.getEJBHome(
IInvoice.JNDI_NAME, InvoiceHome.class);
}
return home.create();
} catch (NamingException e) {
Log.error(CLASS_NAME, "getInvoice()", e.getMessage());
home = null;
} catch (RemoteException e) {
Log.error(CLASS_NAME, "getInvoice()", e.getMessage());
home = null;
} catch (CreateException e) {
Log.error(CLASS_NAME, "getInvoice()", e.getMessage());
home = null;
}
return null;
}
}
package com.company.vas.ejb.helper;
import java.util.Properties;
import javax.ejb.EJBHome;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EjbGetter {
public static EJBHome getEJBHome(String service_jndiname, Class homeInterface) throws NamingException{
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "192.168.60.120:1099");
env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
Context ic = new InitialContext(env);
EJBHome ejbHome = (EJBHome)javax.rmi.PortableRemoteObject.narrow(ic.lookup(service_jndiname), homeInterface);
return ejbHome;
}
}
相关文章推荐
- 关于JavaScript的九个思维导图
- Github上找好东西的方法
- IOS学习之蓝牙4.0
- meta的用法
- win10下安卓开发的因VirtualBox失败影响genymotion加载失败
- 一键安装LAMP服务
- Chrome扩展及应用开发 入门笔记(六)进阶(网络请求,脚本注入)
- equals和==的区别
- Xcode 专辑
- Test checkout of feature 'Compiler' failed.
- 再谈网游同步技术:实时动作游戏同步方式和传输协议选择
- Java解惑
- Stanford CoreNLP 3.6.0 中文指代消解模块调用失败的解决方案
- java 反射
- 数据结构和算法经典100题-第26题
- calendar roll() add()方法的区别
- 云存储(对象存储)性价比小谈
- C#实现Stream与byte[]之间的转换实例教程
- 如何在web页面使用icomoon图标
- http概述