1

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

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

有什么线索吗?

在此先感谢,丹尼尔

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

4

3 回答 3

2

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

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

于 2010-09-11T18:14:23.433 回答
1

以前的问题是,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接口。

于 2010-09-15T14:57:31.430 回答
1

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

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

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

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

于 2010-09-12T06:36:19.447 回答