gpt4 book ai didi

java - Application Client <-> EJB calls round-trip 似乎很慢

转载 作者:行者123 更新时间:2023-11-29 03:59:05 25 4
gpt4 key购买 nike

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


我目前正在修复旧 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 上进行测试。所以网络本身不是问题...

最佳答案

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

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

关于java - Application Client <-> EJB calls round-trip 似乎很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4592976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com