`
snowfox2008
  • 浏览: 127476 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

EJB的HOME接口的高速缓存

阅读更多

EJB的HOME接口的高速缓存- -

 公司的platform产品中用到了基于EJB的工作流,而platform每次调用工作流时,都是通过JNDI对home接口进行lookup,这个动作是很耗性能的,而以前竟然没有进行缓存,汗ing........,刚刚看到了Brett McLaughlin写的一篇<<EJB 最佳实践:工业强度的 JNDI 优化>> 于是赶紧改写了一个home接口的工厂类:

EJBHomeFactory.java
 
public class EJBHomeFactory {
   
    private static Log log = Logger.getLog(EJBHomeFactory.class);
    /**
     * EJBHOME和JNDI参数,直接取得连接时使用
     */
    private static final String WORKLIST_JNDI = "com.company.workflow.engine.worklist.Worklist";
    private static final String WORKLIST_HOME = "com.company..workflow.engine.worklist.WorklistHome";
    private static final String ADMIN_JNDI = "com.company.workflow.engine.admin.Admin";
    private static final String ADMIN_HOME = "com.company..workflow.engine.admin.AdminHome";
    private static final String DEFINITION_JNDI = "com.company..workflow.definition.Definition";
    private static final String DEFINITION_HOME = "com.company..workflow.definition.DefinitionHome";
   
    private static String url;
    private static String userID;
    private static String password;
   
    private Map ejbHomes;
    Context ctx;
    /** 对象本身 */
    private static EJBHomeFactory m_singleton;
   
    static
    {
        url = Config.getString("workflow.jndi.provider.url", null);
        userID = Config.getString("workflow.jndi.security.principal", null);
        password = Config.getString("workflow.jndi.security.credentials", null);
    }
   
    protected EJBHomeFactory() throws NamingException,WorkflowApplicationException{
        ctx = getInitialContext();
        ejbHomes = Collections.synchronizedMap(new HashMap());
    }
   
    /**
     * 返回唯一的静态对象(Singleton模式)
     * @return EJBHomeFactory
     * @throws NamingException 调用new InitialContext()失败时,返回嵌套了一个NamingException的工作流异常
     */
    public static EJBHomeFactory getInstance() throws NamingException,WorkflowApplicationException{
        if ( m_singleton == null)
            m_singleton = new EJBHomeFactory();
        return m_singleton;
    }
    public EJBHome lookUpHome(String jndiName,String homeName) throws NamingException,WorkflowApplicationException {
       
        //先从缓存中取得home接口
        EJBHome homeInterface = (EJBHome)ejbHomes.get(homeName);
        //如果缓存中不存在,则用jndi进行查找
        if (homeInterface == null)
        {
            try
            {
             Object obj = ctx.lookup(jndiName);
             homeInterface =
              (EJBHome)PortableRemoteObject.narrow(obj, Class.forName(homeName));
 
             //将home接口放入缓存中
             ejbHomes.put(homeName, homeInterface);
            }
            catch (Exception e)
            {
                log.error("查找home接口出错", e);
                throw new WorkflowApplicationException("不能获得home接口:" +
                        e.getMessage());
            }
        }
        return homeInterface;
    }
    private Context getInitialContext() throws WorkflowApplicationException
    {
        Context context = null;
        try
        {
           
            Properties prop = new Properties();
            prop.put(Context.INITIAL_CONTEXT_FACTORY,
                    Config.getString("workflow.jndi.factory.initial", null));
            prop.put(Context.PROVIDER_URL,url);
            if (userID != null)
            {
                prop.put(Context.SECURITY_PRINCIPAL, userID);
                prop.put(Context.SECURITY_CREDENTIALS, password);
            }
            context = new InitialContext(prop);
           
        }
        catch (Exception e)
        {
            log.error("初始化服务context出错", e);
            throw new WorkflowApplicationException(e.getMessage());
        }
        return context;
    }
   
    /**
     * 获取Definition的Home接口
     * @return Definition的Home接口
     * @throws NamingException 如果发生工作流应用异常
     */
    public final DefinitionHome getDefinitionHome() throws NamingException,WorkflowApplicationException{
        return (DefinitionHome)m_singleton.lookUpHome(DEFINITION_JNDI,DEFINITION_HOME);
    }
   
    /**
     * 获取Admin的Home接口
     * @return Admin的Home接口
     * @throws NamingException 如果发生工作流应用异常
     */
    public final AdminHome getAdminHome() throws NamingException,WorkflowApplicationException{
        return (AdminHome)m_singleton.lookUpHome(ADMIN_JNDI,ADMIN_HOME);
    }
    /**
     * 获取Worklist的Home接口
     * @return Worklist的Home接口
     * @throws NamingException 如果发生工作流应用异常
     */
    public final WorklistHome getWorklistHome() throws NamingException,WorkflowApplicationException{
        return (WorklistHome)m_singleton.lookUpHome(WORKLIST_JNDI,WORKLIST_HOME);
    }
分享到:
评论

相关推荐

    实战EJB 实战EJB 实战EJB

    EJB2.0引入了本地接口的概念,允许开发者使用本地接口访问EJB组件,提高性能。在这一部分,我们将学习如何使用本地接口实现CMP实体Bean。 **开发EJB2.0的CMP (EJBQL)** EJBQL (Enterprise JavaBeans Query ...

    ejb接口

    1. **Home Interface**(家接口):这是客户端用来创建和管理EJB实例的接口。它提供了查找、创建和移除EJB实例的方法。例如,`create()`方法用于实例化EJB,而`remove()`方法则用于销毁实例。 2. **Remote ...

    Java EJB模型模拟完整代码.rar

    这个"Java EJB模型模拟完整代码.rar"压缩包提供了一个学习EJB模型的实例,它包含了一系列实现特定操作的远程接口、本地Home接口以及各个模块的功能代码。 EJB的核心概念主要包括三个主要组件:Entity Beans(实体...

    在PowerBuilder中呼叫EJB元件-以mail EJB為例

    - **生成的Proxy对象**:PowerBuilder会生成两个Proxy对象,即`mailserver`和`mailserverhome`,分别对应远程接口和Home接口。其中,Home接口提供了create()函数,供客户端调用来获取远程接口实例。 #### 3. 声明...

    JNDI调用分布式EJB3 通用接口

    标题“JNDI调用分布式EJB3 通用接口”意味着我们将探讨如何使用JNDI来查找和调用分布在不同节点上的EJB3组件。EJB3中的一个重要特性是它可以跨网络进行分布,这使得应用程序能够利用多台服务器的资源,提高可伸缩性...

    ejb2.0与ejb3.0的区别

    - **EJB 2.0**:需要为每个实体Bean定义一个Home接口,用于创建和查找Bean实例。 - **EJB 3.0**:取消了Home接口的需求,简化了实体Bean的创建和查找过程。 #### 五、其他变化 - **EJB 3.0**:提供了轻量级的支持,...

    定时调用Ejb接口示例

    项目中用到的定时调用Ejb接口示例。在jboss下通过。需要依赖jbossall-client.jar包

    实战角度比较EJB2和EJB3的架构异同

    EJB2中的对象创建过程通常涉及JNDI查找和工厂方法(如home.create())。EJB3则引入了依赖注入(Dependency Injection,DI)的概念,使用@EJB注解实现对象的自动装配,使得代码更加简洁和松耦合。比如: ```java @...

    经典的EJB模式——门面模式

    在这一模式下,客户端首先通过JNDI(Java Naming and Directory Interface)查找EJB的Home接口,JNDI允许将分布式对象与逻辑名称绑定,使得客户端能通过名称找到EJB。然后,客户端使用Home接口创建远程接口实例,...

    EJB中ejb-jar——xml文件说明.pdf

    &lt;home&gt;元素用于描述EJB组件的Home接口信息,该元素包含了多个子元素,如等。 元素用于描述EJB组件的远程接口信息,该元素包含了多个子元素,如&lt;EJB-CLASS&gt;等。 &lt;EJB-CLASS&gt;元素用于描述EJB组件的实现类信息,例如...

    ejb3.0培训教程与源码(绝对精品)

    Home接口是用来创建和查找EJB Object 接口; 组件接口是不同类型的EJB要求实现的指定的接口; 比如: 会话Bean, 实现SessionBean, 导致 Bean类依赖容器; 2) 可以使用注释来代替配置文件; 3) 简化访问EJB容器...

    面向对象方法EJB组件.pdf

    在给定的【部分内容】中,首先介绍了实现EJB组件的一般过程,包括编写业务逻辑Bean类、定义远程接口和home接口以及编写ejb-jar.xml部署描述文件。然后,将这些组件和描述文件打包成一个ejb-jar文件,并使用服务器...

    weblogic部署EJB2.0 实现本地接口的SessionBean

    在本文中,我们将深入探讨如何在WebLogic环境中部署EJB 2.0,特别是实现本地接口的Session Bean。 EJB 2.0是Java EE早期版本中的组件模型,用于构建可复用、分布式的企业级服务。它定义了三种主要类型的Bean:...

    EJB教程,EJB参考书

    首先,需要安装EJB容器如Apusic Application Server,接着定义远程接口和Home接口,编写EJB类,创建部署描述符`ejb-jar.xml`,最后编译、部署并编写客户端调用程序。 通过上述过程,我们可以看到EJB为开发者提供了...

    EJB视频教程 3.开发EJB的客户端 4.把jboss集成进eclipse

    1. **EJB客户端接口**:了解EJB客户端如何与远程服务器上的EJB组件进行交互,包括定义Home接口和Remote接口,以及调用EJB方法的步骤。 2. **JNDI查找**:学习如何通过Java Naming and Directory Interface (JNDI) ...

    Weblogic Ejb 学习笔记

    - WebLogic Server提供多种性能优化选项,如缓存管理、JVM调优、连接池配置等,以提高EJB应用的性能。 11. **EJB 3.1和以上版本的新特性** - 自动化的注解驱动编程降低了EJB的复杂性,如@Stateless、@Stateful、@...

    EJB方面 ejb pdf

    理论上任何Java类都可能被视为一个Bean,但在实践中,JavaBean通常具备无参数构造函数,并实现了`Serializable`接口以支持持久化。JavaBean类似于COM模型中的本地进程内组件,不具备跨进程访问能力。 - **...

    EJB实例工程代码

    对于实体bean,可能有home接口(Home Interface)和远程接口。 4. **部署描述符**(Deployment Descriptor):这是XML文件,包含了EJB组件的配置信息,如组件的名称、接口、安全设置等。在EJB 3.0及以上版本,可以...

    WTC暴露ejb服务说明

    - EJB的remote home接口类应继承自`weblogic.wtc.jatmi.TuxedoServiceHome`,这是创建和查找EJB实例的入口。 - EJB的bean类中至少有一个方法暴露为服务,例如上面代码中的`service`方法。这个方法会接收Tuxedo传递的...

Global site tag (gtag.js) - Google Analytics