我使用的重要技术有:Glassfish v3、JSF 2.0、JPA 2.0、EclipseLink 2.0.2、log4j 1.2.16、commons-logging 1.1.1。
我的问题是应用程序的某些部分非常慢。我使用netbeans 6.8 Profiling功能对此进行了分析。
I. 日志- 我使用 log4j 和 apache commons 日志在日志文件和控制台中生成日志。日志也出现在 glassfish 的服务器日志中。我使用记录器如下:
private static Log logger = LogFactory.getLog(X.class);
...
if (logger.isDebugEnabled()) {
...
logger.debug("Log...");
}
问题是有时这样短的语句需要很长时间(大约 800 毫秒)。当我切换到 java.util.logging 时,它还不错,但也很慢(200 ms 波段)。有什么问题?我需要一些日志记录...更新- 从 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()
}
}
三、依赖注入,JNDI 查找:DI 之类的(@EJB ...)和 InitialContext 查找与性能有关吗?注入本地、远程和无接口 EJB 之间是否存在差异(性能视图)?
四。Managed Beans - 我使用了许多 Session Scoped Beans,因为 ViewScope 似乎有很多错误,并且 Request Scoped 并不总是实用的。有替代方案吗?- 因为这些 Bean 并不慢,但在整个会话期间服务器端内存压力很大。当用户注销时,它需要一些时间!
V. EJB——我不只使用 MDB 会话 Bean 和单例 Bean。他们经常使用@EJB注解注入其他 Bean。一个 Singleton Bean 使用@Schedule Annotations 来启动重复操作。我发现一个有趣的事情是,从 EJB 3.1 开始,您可以使用@Asynchronous Annotation 使 Session Bean Method 异步。在实施有关性能的 EJB 时,我通常应该考虑什么?
也许有人可以给我一些一般和/或具体的技巧来提高 javaee 应用程序的性能,特别是关于上述问题。谢谢!