【问题标题】:Java EJB/Hibernate performance, slower first callJava EJB/Hibernate 性能,第一次调用较慢
【发布时间】:2014-10-15 13:45:24
【问题描述】:

我有一个 Java 应用程序,它使用 EJB 客户端调用服务器。服务器端 EJB 的 create 再次调用 DB。使用休眠,但禁用二级缓存。当使用 EJB 客户端对 DB 调用进行性能测试时,通常第一次调用比下一次调用花费更长的时间,即使调用是使用不同的参数进行的。在这种情况下,哪些事情可以解释或影响性能?

【问题讨论】:

    标签: java performance hibernate jakarta-ee ejb


    【解决方案1】:

    顶部的 EJB 使用 Java 的 RMI 调用。每当您的客户端调用在 EJB 容器中运行的 EJB 组件时,就会同时执行一些昂贵的操作。

    比方说,您有一个名为 HelloRemote 的远程接口和一个名为 HelloBean 的服务 bean,它实现 HelloRemote 界面

    1) 首先,您的客户需要查找JNDI Registry 注册的服务对象:

    HelloRemote service=(HelloRemote)context.lookup("HelloBean/remote");  
    // JBoss specific
    

    这里,

    i)您的客户端调用包含 JNDI 注册表的 LDAP 服务器并查找使用给定名称注册的远程 bean。

    ii) 如果找到具有给定名称的任何 bean 注册表,则容器首先序列化已注册的 bean 对象并将其发送到客户端,然后再次deserialized 也称为 marshalingunmarshaling

    上述步骤本身的成本有点高,这就是为什么如果您的应用程序架构要为客户端应用程序和会话 bean 使用相同的 JVM,那么建议使用本地接口(可以是从 EJB 3.1 开始的 no-interface 选项)而不是使用远程接口。

    iii) 有了业务接口存根,您现在可以调用该存根接口上的业务操作。此存根执行所需的序列化并将调用委托给容器。

    容器现在执行反序列化并调用业务接口对象上的相应方法。当这个调用的结果被返回给客户端时,也会发生同样的过程。

    如您所见,当客户端与 EJB 组件通信时,会发生大量序列化和反序列化。 启用二级缓存确实可以提高 Hibernate 中的性能,但是从 EJB 客户端和 EJB 服务对象的 b/w 通信来看,时间成本更高。

    注意:我一直在找人回复这篇文章,因为我也很想知道原因,但是没有找到任何回复,我有这篇文章,我对这些主题有任何理解强>

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多