Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序客户端EJB调用的往返速度似乎很慢_Java_Performance_Jakarta Ee_Glassfish - Fatal编程技术网

Java 应用程序客户端EJB调用的往返速度似乎很慢

Java 应用程序客户端EJB调用的往返速度似乎很慢,java,performance,jakarta-ee,glassfish,Java,Performance,Jakarta Ee,Glassfish,更新:正如普雷斯顿指出的,以下问题很可能与对象的反序列化有关。关于如何优化这一点有什么想法吗 我目前正在修复一个旧的JavaEE应用程序中的一些东西。它使用一个EJB模块和一个应用程序客户机模块。EJB处理所有数据库查询。对于这个例子,考虑一个方法GeMealEsSeriStEnter,它为给定的一年返回企业实体。目前,大约有2500个条目 注:我使用“企业”一词仅用于说明目的。对于这里的大多数人来说,真正的实体类可能没有多大意义 现在,让我们假设本例中的企业实体只有两个字段:code和name

更新:正如普雷斯顿指出的,以下问题很可能与对象的反序列化有关。关于如何优化这一点有什么想法吗

我目前正在修复一个旧的JavaEE应用程序中的一些东西。它使用一个EJB模块和一个应用程序客户机模块。EJB处理所有数据库查询。对于这个例子,考虑一个方法GeMealEsSeriStEnter,它为给定的一年返回企业实体。目前,大约有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);
所以我猜问题在于客户机/服务器通信。注意,对于上面的示例,我没有检查客户机->服务器通信是否慢,或者服务器->客户机通信是否慢。我意识到的是,服务器日志显示了预期的执行时间,而在客户机上则是缓慢的。换句话说,也可能是这样的:

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没有太多的经验,我在丛林中有点迷路了。有太多的设置和组件,我必须仔细查看,我不知道从哪里开始。它可以是服务器设置吗?豆子本身有问题吗?我怎么称呼豆子?我不知道


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

对于任何与网络相关的事情,我的第一个目标是找出时间的实际去向:是你的朋友。尝试将日志语句映射到网络流量。如果在服务器日志记录完成和数据在网络上传输之间有很大的延迟,那么您应该进一步查看服务器端配置等。如果数据已经传输到客户端,但是方法调用需要很长时间才能完成,那么请查看客户端。如果数据在服务器和客户机之间的传输在这15秒内缓慢进行,那么可能完全是另一回事,您可能需要同时考虑这两方面


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

对于任何与网络相关的内容,我的第一个呼叫端口是确定时间的实际去向:是您的朋友。尝试将日志语句映射到网络流量。如果在服务器日志记录完成和数据在网络上传输之间有很大的延迟,那么您应该进一步查看服务器端配置等。如果数据已经传输到客户端,但是方法调用需要很长时间才能完成,那么请查看客户端。如果数据在服务器和客户机之间的传输在这15秒内缓慢进行,那么可能完全是另一回事,您可能需要同时考虑这两方面


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

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

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

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

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

打得好。我已经准备好了一台测试服务器。我将在那里部署,看看它是如何运行的……我已经在第二台服务器上尝试了一下午的日志工作。就我的一生而言,我无法获得任何日志输出。我现在将我的消息设置为严重。仍然没有输出。。。还尝试使用S.o.println启动domain-verbose=true。没有运气。。。这让我挠头。将尝试从我的本地主机复制domain.xml,因为它在这里工作….:|好电话。我有一个测试
服务器准备好了。我将在那里部署,看看它是如何运行的……我已经在第二台服务器上尝试了一下午的日志工作。就我的一生而言,我无法获得任何日志输出。我现在将我的消息设置为严重。仍然没有输出。。。还尝试使用S.o.println启动domain-verbose=true。没有运气。。。这让我挠头。将尝试从我的本地主机复制domain.xml,因为它在这里工作….:|我假设这只是CPU和内存在工作?那么我认为这不应该是个问题。但很有可能,情况是这样的:您将如何进行测试?序列化的方法有很多,但更好的测试可能是更改查询,使其仅返回1行。似乎就是这样。将其限制为仅一个条目大大减少了方法调用所花费的时间。关于如何优化这一点,你有什么想法吗?好的,在这一点上,你就是我所处的位置。我也遇到过类似的问题,甚至使用了直接的jdbc并试图将结果加载到集合中。据我所知,问题是,无论您是在做,还是在持久层做,将这些内容从结果集中提取到集合中都需要很长时间。幸运的是,我所做的一切都是服务器端的,我发现使用直接的jdbc连接然后迭代结果集要快得多。然而,在你的情况下,这是行不通的。你必须一次拥有所有的1500块吗?也许你可以改变它,让它一次返回100块,然后在你的客户机上使用一个后台线程,不断获取100块,直到你拥有你所需要的一切。当然,这是假设您可以立即开始使用前100个,其他的可以在第一批处理过程中插入。我假设这只是CPU和内存在工作?那么我认为这不应该是个问题。但很有可能,情况是这样的:您将如何进行测试?序列化的方法有很多,但更好的测试可能是更改查询,使其仅返回1行。似乎就是这样。将其限制为仅一个条目大大减少了方法调用所花费的时间。关于如何优化这一点,你有什么想法吗?好的,在这一点上,你就是我所处的位置。我也遇到过类似的问题,甚至使用了直接的jdbc并试图将结果加载到集合中。据我所知,问题是,无论您是在做,还是在持久层做,将这些内容从结果集中提取到集合中都需要很长时间。幸运的是,我所做的一切都是服务器端的,我发现使用直接的jdbc连接然后迭代结果集要快得多。然而,在你的情况下,这是行不通的。你必须一次拥有所有的1500块吗?也许你可以改变它,让它一次返回100块,然后在你的客户机上使用一个后台线程,不断获取100块,直到你拥有你所需要的一切。当然,这是假设您可以立即开始处理前100个,而其他人可以在处理第一批时临时加入。
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