簡體   English   中英

JSF +無狀態EJB性能

[英]JSF + Stateless EJB performance

我有一個在GlassFish v3上運行的JSF 2.0應用程序。 它具有通過JPA為主應用程序會話提供數據庫數據的EJB。 即使在非IDE app-server上,EJB調用也非常慢。 在某些頁面之間,用戶必須等待10秒以上才能進入下一頁。

EJB在同一個應用程序服務器上運行,只使用Local接口。 EJB通過@EJB注釋注入。

有線索嗎?

謝謝,丹尼爾

編輯請參閱我的解決方案的答案。

如果沒有對代碼進行概要分析和/或對業務邏輯中的每個部分進行單元測試,就很難分辨出哪一步確實花了那么多時間。 我最初的懷疑是數據庫性能。 也許該表包含數百萬條記錄並且編制索引很差,導致簡單的SELECT需要很長時間。 可能網絡帶寬很差,導致需要更多時間來傳輸數據。

在這一點上,盡管給出了很少的信息,但它可以是一切。 我只是簡介它。

在調試時,應用程序停留在EJB調用幾秒鍾,之后它跳入EJB方法並且運行正常。

您需要提供更多詳細信息:

  • 您使用LocalRemote接口嗎? 客戶端(webapp)是否在遠程計算機上?
  • 你如何訪問EJB? 他們注射了嗎? 你執行JNDI查找嗎?
  • 你測量了什么? (在分析期間或在各個點使用System.nanoTime()
  • 這些措施是否真的表明大部分時間都花在調用本身上?

回答這些問題應該有助於確定在哪里尋找和可能的原因。

之前的問題是, 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接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM