`

小心new InitialContext()

阅读更多

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

 

其中,Tool.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);
	}
}

 

 

然后这样调用:

EJBHomeFactory f = EJBHomeFactory.getInstance();
Object o = f.lookup(remote);

 

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

欢迎大家指教。大家还可以参考此文档:《EJB 最佳实践: 工业强度的 JNDI 优化

分享到:
评论
2 楼 hongyangname 2013-05-03  
你确定这个是单例吗
1 楼 zhuchao_ko 2011-06-14  
  

相关推荐

    JNDI连接数据库配置

    在这段代码中,我们首先通过`new InitialContext()`创建了一个初始上下文对象`initCtx`。接着,通过调用`initCtx.lookup("java:comp/env")`来获取Java环境命名上下文`envCtx`。之后,再通过`envCtx.lookup("jdbc/...

    JNDI配置原理详解.doc

    InitialContext ctx = new InitialContext(); return ctx.lookup("java:comp/env/systemStartTime"); } ``` 该代码在服务器环境中运行良好,但在独立应用程序中会抛出`NoInitialContextException`。这是因为`...

    Java EJB简单例子.rar

     InitialContext jndiContext = new InitialContext(properties);  //取得Home对象的引用  Object ref = jndiContext.lookup("HelloWorldHome");  HelloWorldHome home = (HelloWorldHome)  ...

    初学jndi笔记

    Context ctx = new InitialContext(); ``` 此方法使用默认配置来创建Initial Context。 2. **自定义连接**: - 创建环境配置对象`Environment`,并设置必要的属性,如提供者URL、用户名和密码等。 - 使用环境...

    EJB HelloWorld

    InitialContext ctx = new InitialContext(props); HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote"); out.println(helloworld.SayHello("佛山人")); 5.用ant或eclipse,把...

    基于Java的实例开发源码-EJB中JNDI的使用源码例子.zip

    InitialContext initialContext = new InitialContext(jndiProps); MyRemoteInterface myBean = (MyRemoteInterface) initialContext.lookup("ejb:/MyApp/MyModule/MyBean!com.example.MyRemoteInterface"); ``` 在...

    EJB client调用EJB3 .doc

    InitialContext ctx = new InitialContext(); HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote"); ``` 这里,`ctx.lookup()`方法用于根据EJB的JNDI名称查找并实例化EJB。由于在同一个...

    java 采用JNDI访问数据库(三种方法)

    InitialContext ic = new InitialContext(); DataSource dataSource = (DataSource) ic.lookup("java:comp/env/jdbc/MyDB"); Connection conn = dataSource.getConnection(); // 使用连接进行数据库操作 } ...

    java 连接ldap 服务器源码

    DirContext dirContext = (DirContext) initialContext.lookup(new InitialContext().getEnvironment(), ldapUrl); // 绑定到 LDAP 服务器 dirContext.bind(bindDN, bindPassword); // 执行 LDAP 查询 ...

    使用dbutils获取tomcat数据库连接池.pdf

    Context ctxOracle = new InitialContext(); DataSource dsOracle = (DataSource) ctxOracle.lookup("java:comp/env/jdbc/oracleds"); Connection connOracle = dsOracle.getConnection(); ``` 3. **集成DBUtils**...

    Java 如何使用AMQP协议订阅启用Partition 的Azure ServiceBus Topic1

    Context context = new InitialContext(); ConnectionFactory factory = (ConnectionFactory) context.lookup("myFactoryLookup"); Connection connection = factory.createConnection(USER, PASSWORD); ``` 然后,...

    weblogic数据源调用

    Context ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/DataSourceName"); Connection conn = ds.getConnection(); ``` - 这种方式适用于Java EE的环境,如EJB或...

    mysql、sqlserver、oracle分页,java分页统一接口实现

    initContext = new InitialContext(); ds = (DataSource) initContext.lookup(dataSourceName); } catch (NamingException e) { e.printStackTrace(); } } public int update(String sql, String[] param) {...

    04_JNDI.pdf

    Context ctx = new InitialContext(env); ``` 这段代码展示了如何创建`Hashtable`对象并设置JNDI环境属性,最后通过这些属性创建`InitialContext`对象。 总结来说,JNDI作为一种重要的Java API,为开发者提供了...

    java操作数据库

    InitialContext ctx = new InitialContext(env); DataSource ds = (DataSource) ctx.lookup("Book"); Connection conn = ds.getConnection(); Statement stat = conn.createStatement(); ``` 通过上述步骤,...

    JNDI简单应用示例

    Context initialContext = new InitialContext(props); ``` 2. **查找资源**:一旦有了初始上下文,就可以通过调用`lookup()`方法来查找资源。例如,如果你知道一个数据源的名字是"java:comp/env/jdbc/MyDB",你...

    “E-家园”个人网站

    Context ic = new InitialContext(); DataSource source = (DataSource) ic. lookup("java:comp/env/jdbc/ownHome"); conn = source.getConnection(); } catch (Exception e) { throw new DBAccessException("不能...

    JAVA中JNDI源码范例

    这通常通过调用`new InitialContext()`完成。 2. **查找数据源(Lookup DataSource)**:然后,使用初始上下文查找已经配置好的数据源。数据源通常在应用服务器的配置文件中定义,如Tomcat的`context.xml`或...

    java jndi的使用

    这通常通过调用`new InitialContext()`完成。 2. **查找JNDI资源**:接着,使用`lookup()`方法通过给定的JNDI名称查找资源,如数据源。例如: ```java Context context = new InitialContext(); DataSource ...

Global site tag (gtag.js) - Google Analytics