【问题标题】:JSF + Stateless EJB performanceJSF + 无状态 EJB 性能
【发布时间】:2010-09-11 18:00:30
【问题描述】:

我有一个在 GlassFish v3 上运行的 JSF 2.0 应用程序。它具有通过 JPA 为主要应用程序会话提供数据库数据的 EJB。即使在非 IDE 应用服务器上,EJB 调用也非常慢。在某些页面之间,用户必须等待超过 10 秒才能到达下一页。

EJB 运行在同一个应用服务器上,只使用Local 接口。 EJB 是通过@EJB 注解注入的。

有什么线索吗?

提前致谢, 丹尼尔

编辑请参阅我的答案以获得解决方案。

【问题讨论】:

    标签: performance jsf jakarta-ee ejb-3.0 stateless-session-bean


    【解决方案1】:

    如果不对代码进行概要分析和/或对业务逻辑中的每个部分进行单元测试,以了解究竟是哪一步花费了这么多时间,就很难判断。我最初的怀疑是数据库性能。也许该表包含数百万条记录并且索引不佳,这导致简单的SELECT 需要很长时间。可能是网络带宽很差,导致传输数据需要更多时间。

    在这一点上,就目前所提供的信息很少,它可以是一切。我只想profile它。

    【讨论】:

      【解决方案2】:

      在调试时,应用程序在 EJB 调用处卡住了几秒钟,之后它跳转到 EJB 方法中并且运行良好。

      您需要提供更多详细信息:

      • 您使用LocalRemote 接口吗?客户端(webapp)是否在远程机器上?
      • 如何访问 EJB?他们被注射了吗?您是否执行 JNDI 查找?
      • 您测量了什么? (在分析期间或在不同点使用System.nanoTime()
      • 这些度量是否真的表明大部分时间都花在了调用本身上?

      回答这些问题应该有助于确定在哪里寻找和可能的原因。

      【讨论】:

        【解决方案3】:

        之前的问题是,LocalRemote接口都实现了,只用到了Remote接口,不过没必要。两个接口都有相同的方法,根据我收到的 NetBeans 警告消息,这是要避免的:

        当会话 bean 具有远程和本地业务接口时,这两个接口不应该有任何共同的方法。

        更详细:

        远程业务方法的调用语义非常不同 从当地的商业方法。因此,当会话 bean 有远程和本地的业务方法,不应该有 两个接口通用的方法。下面的例子是不正确的使用 案例:

        Remote public interface I1 { void foo();}
        Local public interface I2 { void foo();}
        Stateless public class Foo implements I1, I2 { ... }
        

        所以解决办法是去掉Remote接口,设置应用逻辑使用Local接口。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-31
          • 2013-03-19
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          相关资源
          最近更新 更多