应用程序客户端< - > EJB调用往返似乎很慢

时间:2011-01-04 11:14:20

标签: java performance java-ee glassfish

更新:正如普雷斯顿所指出的,以下问题可能与(反)对象序列化有关。关于如何优化这个的任何想法?


我目前正在修复旧JavaEE应用程序中的一些内容。它使用EJB模块和应用程序客户端模块。 EJB处理所有数据库查询。对于此示例,请考虑方法getEnterprises(int year),该方法返回给定年份的“Enterprise”实体。目前,这是大约2500个条目。

注意:我使用“企业”一词仅用于说明目的。真正的实体类对大多数人来说可能没什么意义;)

现在,我们假设此示例企业实体只有两个字段:codename。远程bean内部的方法如下所示:

public List<Enterprise> getEnterprises(int year){
    return em.createQuery("SELECT e FROM Enterprise e WHERE e.year=:year")
        .setParameter("year", year)
        .getResultList();
}

在应用程序客户端中,有一行如下:

List<Enterprise> result = requestBean.getEnterprises(1996);

这对我来说似乎是正确的。对我来说奇怪的是,客户端的呼叫大约需要15秒才能完成!所以我添加了一些日志记录:

public List<Enterprise> getEnterprises(int year){
    logger.finest("Begin fetch on remote");
    List<Enterprise> output = em.createQuery("SELECT e FROM Enterprise e WHERE e.year=:year")
        .setParameter("year", year)
        .getResultList();
    logger.finest("End fetch on remote");
    return output;
}

和...

logger.finest("Begin fetch on client");
List<Enterprise> result = requestBean.getEnterprises(1996);
logger.finest("End fetch on client");

从生成的时间戳中,我意识到服务器上的呼叫在不到一秒的时间内完成,而在客户端上则需要15秒以上。

示例手写跟踪:

2011-01-04 12:00 | FINEST | Begin fetch on client
2011-01-04 12:00 | FINEST | Begin fetch on remote
2011-01-04 12:01 | FINEST | End fetch on remote
2011-01-04 12:17 | FINEST | End fetch on client

所以我猜测问题在于客户端/服务器通信。请注意,对于上面的示例,我没有检查客户端 - >服务器通信是否缓慢或服务器与客户端通信。我意识到,服务器日志显示“预期”的执行时间,而在客户端上它是缓慢的。换句话说,它也可能是这样的:

2011-01-04 12:00 | FINEST | Begin fetch on client
2011-01-04 12:15 | FINEST | Begin fetch on remote
2011-01-04 12:16 | FINEST | End fetch on remote
2011-01-04 12:17 | FINEST | End fetch on client

甚至:

2011-01-04 12:00 | FINEST | Begin fetch on client
2011-01-04 12:07 | FINEST | Begin fetch on remote
2011-01-04 12:08 | FINEST | End fetch on remote
2011-01-04 12:17 | FINEST | End fetch on client

我没有那么多挖掘它。

由于我没有那么多JavaEE的经验,我在丛林中有点迷失。有很多设置,组件,我必须通过,我不知道从哪里开始。它可以是服务器设置吗? bean本身有问题吗?我称之为bean的方式?我不知道......

......哦......它在glassfish上运行,并在localhost上进行测试。所以网络本身不是问题......

3 个答案:

答案 0 :(得分:2)

对于像这样的网络相关的任何事情,我的第一个停靠点是找出时间实际的时间:Wireshark是你的朋友。尝试将日志语句映射到网络流量。如果完成的服务器日志记录与网络上传送的数据之间存在巨大延迟,那么您应该进一步查看服务器端配置等。如果数据已经传送到客户端但是方法花费了很长时间打电话完成,看看客户端。如果数据在这15秒内缓慢地在服务器和客户端之间传输,那么这可能完全是另一回事(你可能需要看两边)。

为了使您更容易诊断可能想在不同的计算机上运行服务器和客户端 - 如果您知道它必须通过物理接口,它可以使网络跟踪更容易。

答案 1 :(得分:1)

如果配置文件看起来像您的第二个手写跟踪(慢速连接,快速返回),它可能与DNS查找有关。我最近遇到了类似的问题 - 快速ping,连接速度非常慢(45s)到localhost。在/ etc / hosts中添加名称条目可以快速查找完全限定的主机名。

答案 2 :(得分:1)

为了让客户端接收列表,需要在发送之前对其进行序列化。尝试在服务器上对其进行序列化以查看它需要多长时间。然后从15秒内扣除该时间,看看你是否还有问题。