更新:正如普雷斯顿所指出的,以下问题可能与(反)对象序列化有关。关于如何优化这个的任何想法?
我目前正在修复旧JavaEE应用程序中的一些内容。它使用EJB模块和应用程序客户端模块。 EJB处理所有数据库查询。对于此示例,请考虑方法getEnterprises(int year)
,该方法返回给定年份的“Enterprise”实体。目前,这是大约2500个条目。
注意:我使用“企业”一词仅用于说明目的。真正的实体类对大多数人来说可能没什么意义;)
现在,我们假设此示例企业实体只有两个字段:code
和name
。远程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
上进行测试。所以网络本身不是问题......
答案 0 :(得分:2)
对于像这样的网络相关的任何事情,我的第一个停靠点是找出时间实际的时间:Wireshark是你的朋友。尝试将日志语句映射到网络流量。如果完成的服务器日志记录与网络上传送的数据之间存在巨大延迟,那么您应该进一步查看服务器端配置等。如果数据已经传送到客户端但是方法花费了很长时间打电话完成,看看客户端。如果数据在这15秒内缓慢地在服务器和客户端之间传输,那么这可能完全是另一回事(你可能需要看两边)。
为了使您更容易诊断可能想在不同的计算机上运行服务器和客户端 - 如果您知道它必须通过物理接口,它可以使网络跟踪更容易。
答案 1 :(得分:1)
如果配置文件看起来像您的第二个手写跟踪(慢速连接,快速返回),它可能与DNS查找有关。我最近遇到了类似的问题 - 快速ping,连接速度非常慢(45s)到localhost。在/ etc / hosts中添加名称条目可以快速查找完全限定的主机名。
答案 2 :(得分:1)
为了让客户端接收列表,需要在发送之前对其进行序列化。尝试在服务器上对其进行序列化以查看它需要多长时间。然后从15秒内扣除该时间,看看你是否还有问题。