我有一个在 GlassFish v3 上运行的 JSF 2.0 应用程序。它具有通过 JPA 为主要应用程序会话提供数据库数据的 EJB。即使在非 IDE 应用服务器上,EJB 调用也非常慢。在某些页面之间,用户必须等待超过 10 秒才能到达下一页。
EJB 运行在同一个应用服务器上,只Local
使用接口。EJB 通过@EJB
注解注入。
有什么线索吗?
在此先感谢,丹尼尔
编辑请参阅我的答案以获取解决方案。
我有一个在 GlassFish v3 上运行的 JSF 2.0 应用程序。它具有通过 JPA 为主要应用程序会话提供数据库数据的 EJB。即使在非 IDE 应用服务器上,EJB 调用也非常慢。在某些页面之间,用户必须等待超过 10 秒才能到达下一页。
EJB 运行在同一个应用服务器上,只Local
使用接口。EJB 通过@EJB
注解注入。
有什么线索吗?
在此先感谢,丹尼尔
编辑请参阅我的答案以获取解决方案。
如果不对代码进行概要分析和/或对业务逻辑中的每个部分进行单元测试,以了解究竟哪个步骤花费了这么多时间,就很难说清楚。我最初的怀疑是数据库性能。也许该表包含数百万条记录并且索引很差,这会导致简单SELECT
的耗时。也许网络带宽很差,导致传输数据需要更多时间。
在这一点上,就目前所提供的信息很少,它可以是一切。我只是简述它。
以前的问题是,Local
和Remote
接口都实现了,只使用了 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
接口。
在调试时,应用程序在 EJB 调用处卡住了几秒钟,之后它跳转到 EJB 方法中并且运行良好。
您需要提供更多详细信息:
Local
还是Remote
接口?客户端(webapp)是否在远程机器上?System.nanoTime()
在各个点使用)回答这些问题应该有助于确定在哪里寻找和可能的原因。