私が使用する重要なテクノロジは、Glassfish v3、JSF 2.0、JPA 2.0、EclipseLink 2.0.2、log4j 1.2.16、commons-logging 1.1.1 です。
私の問題は、アプリケーションの一部がかなり遅いことです。これをnetbeans 6.8 プロファイリング機能で分析しました。
I. ロギング- log4j と apache commons ロギングを使用して、ロギング ファイルとコンソールにログを生成します。ログは、glassfish のサーバー ログにも表示されます。次のようにロガーを使用します。
private static Log logger = LogFactory.getLog(X.class);
...
if (logger.isDebugEnabled()) {
...
logger.debug("Log...");
}
問題は、このような短いステートメントに時間がかかる場合があることです (約 800 ミリ秒)。java.util.logging に切り替えると、それほど悪くはありませんが、非常に遅くなります (200 ミリ秒帯域)。どうしたの?ロギングが必要です...更新- Netbeans 6.8 から Netbeans 6.9.1 に切り替えた後、ロギングが遅いという問題が解決されました。- ログがコンソールに出力されると、Netbeans 6.8 が非常に遅くなる可能性があります?! したがって、Log4J やコモンズのロギングとは何の関係もありませんでした。
Ⅱ.DB 操作: 次の EJB の find メソッドを初めて呼び出すと、2,4 秒かかります。追加の呼び出しは数ミリ秒しか持続しません。では、なぜ最初の操作にそれほど時間がかかるのでしょうか? これは (単に) 接続の確立によるものですか、それとも XFacade の依存性インジェクションと関係がありますか? これらのインジェクションはいつ実行されますか?:
@Stateless
@PermitAll
public class XFacade {
@PersistenceContext(unitName = "de.x.persistenceUnit")
private EntityManager em;
// Other DI's
...
public List<News> find(int maxResults) {
return em.createQuery(
"SELECT n FROM News n ORDER BY n.published DESC").setMaxResults(maxResults).getResultList()
}
}
III. 依存性注入、JNDI ルックアップ: DI のような ( @EJB ...) とパフォーマンスに関する InitialContext ルックアップに違いはありますか? ローカル、リモート、およびインターフェースなしの EJB の注入に違い (パフォーマンス ビュー) はありますか?
IV. Managed Beans - ViewScope は非常にバグが多く、Request Scoped は常に実用的であるとは限らないため、多くの Session Scoped Bean を使用しています。代替手段はありますか?- これらの Bean は低速ではありませんが、セッション全体でサーバー側のメモリに負荷がかかるためです。また、ユーザーがログアウトすると、しばらく時間がかかります!
V. EJB - MDB のみのセッション Bean とシングルトン Bean は使用しません。多くの場合、@EJBアノテーションを使用して他の Bean を注入します。1 つの Singleton Bean は、@Scheduleアノテーションを使用して繰り返し操作を開始します。私が見つけた興味深いことは、EJB 3.1 以降、@Asynchronousアノテーションを使用してセッション Bean メソッドを非同期にすることができるということです。パフォーマンスに関して EJB を実装する場合、一般的に何を考慮する必要がありますか?
特に上記の問題に関して、javaeeアプリケーションのパフォーマンスを向上させるための一般的および/または特定のヒントを誰かが教えてくれるかもしれません。ありがとう!