如何在java中更快地从远程服务器检索数据?
我有一个增强的for循环,它进入ch.ethz.ssh2.connection以获得200多个值。每次它进入循环时,一个新服务器正在进行身份验证,它只从该服务器检索一个值。每次循环时,数据都被保存到arraylist中,以便使用thymeleaf在html表中显示。但是这个方法需要eclipse一次一个地运行所有200个值,然后当我打开localhost:8080加载所有包含所有数据的表时,它必须重新启动。加载页面需要5分钟以上。我能做些什么来加快速度 代码中的问题如何在java中更快地从远程服务器检索数据?,java,Java,我有一个增强的for循环,它进入ch.ethz.ssh2.connection以获得200多个值。每次它进入循环时,一个新服务器正在进行身份验证,它只从该服务器检索一个值。每次循环时,数据都被保存到arraylist中,以便使用thymeleaf在html表中显示。但是这个方法需要eclipse一次一个地运行所有200个值,然后当我打开localhost:8080加载所有包含所有数据的表时,它必须重新启动。加载页面需要5分钟以上。我能做些什么来加快速度 代码中的问题 List<DartMo
List<DartModel> data = new ArrayList<DartModel>();
for(String server:serverArray) {
try {
conn = new ch.ethz.ssh2.Connection(server);
conn.connect();
boolean isAuthenticated = conn
.authenticateWithPassword(username_array[j],
password_array[j]);
if (isAuthenticated == false) {
throw new IOException("Authentication failed.");
}
备选方案
List<DartModel> data = new ArrayList<DartModel>();
for(String server:serverArray) {
try {
conn = new ch.ethz.ssh2.Connection(server);
conn.connect();
boolean isAuthenticated = conn
.authenticateWithPassword(username_array[j],
password_array[j]);
if (isAuthenticated == false) {
throw new IOException("Authentication failed.");
}
我想让java程序运行几次,同时将数据保存到redis中。然后自动刷新程序,运行时将数据发送到redis。设置过期时间,但我无法将数据放入thymeleaf html表中。这样行吗?如果是这样,我如何将其显示到thymeleaf中。简短回答:创建在一个响应中发送所有值的消息协议 更多信息:
定义一个简单的响应消息协议。 一个简单的例子可能是:
count,value,...
count: contains the number of values returned.
value: one of the values.
具体的简单例子:
5,123,234,345,456,567
您可以使用json或XML定义更大的响应。
使用最适合您的实现的东西
编辑:我的坏消息,如果您正在轮询多个服务器,这将不起作用。此解决方案假定您正在从一台服务器检索200个值,而不是从200台服务器检索一个值。简短回答:创建在一个响应中发送所有值的消息协议 更多信息:
定义一个简单的响应消息协议。 一个简单的例子可能是:
count,value,...
count: contains the number of values returned.
value: one of the values.
具体的简单例子:
5,123,234,345,456,567
您可以使用json或XML定义更大的响应。
使用最适合您的实现的东西
编辑:我的坏消息,如果您正在轮询多个服务器,这将不起作用。此解决方案假定您正在从一台服务器检索200个值,而不是从200台服务器检索一个值。您可以一次(并行)查询多台服务器 如果您的远程连接框架是阻塞的(您调用的方法实际上要等到收到响应),那么您必须启动少数线程(在边缘情况下,一个服务器一个线程)来并行执行(扩展性不太好) 当您可以使用一些基于未来/承诺的工具时,您可以不用太多开销(将200个期货转换为一个200个价值/响应的未来)
注意:若您要查询单个服务器的200个响应,那个么这样做是不好的,因为一次会有太多的请求充斥其中。然后,您应该实现某种方法,通过一个请求获取所有数据。您可以一次(并行)查询多个服务器 如果您的远程连接框架是阻塞的(您调用的方法实际上要等到收到响应),那么您必须启动少数线程(在边缘情况下,一个服务器一个线程)来并行执行(扩展性不太好) 当您可以使用一些基于未来/承诺的工具时,您可以不用太多开销(将200个期货转换为一个200个价值/响应的未来)
注意:若您要查询单个服务器的200个响应,那个么这样做是不好的,因为一次会有太多的请求充斥其中。然后,您应该实现某种方法,通过一个请求获取所有数据。从表面上看,不看代码就很难判断(建议共享要点或代码报告) 我想你正在使用。通常,单个SSH2操作将进行多个尝试以对客户端进行身份验证。它将迭代几个“方法”。如果您在命令行上使用ssh,那么在使用标志-vv时可以看到这些。如果一个失败了,它会尝试下一个。我发现的java库实现似乎也是这样做的 在您发布的循环中(假设您循环了200次),您将尝试验证200x(验证方法顺序)。我怀疑您的大部分执行可能都是在SSH握手中烧掉的。通过确保只使用一次连接,并从(已验证的)打开的套接字获取尽可能多的连接,可以避免这种情况
考虑将您的连接移动到循环之外。如果您绝对必须使用ssh,并且您使用的数据太大,并行性可能会有所帮助,但这将涉及更多的协调 从表面上看,不看你的代码很难判断(建议分享要点或代码回购) 我想你正在使用。通常,单个SSH2操作将进行多个尝试以对客户端进行身份验证。它将迭代几个“方法”。如果您在命令行上使用ssh,那么在使用标志-vv时可以看到这些。如果一个失败了,它会尝试下一个。我发现的java库实现似乎也是这样做的 在您发布的循环中(假设您循环了200次),您将尝试验证200x(验证方法顺序)。我怀疑您的大部分执行可能都是在SSH握手中烧掉的。通过确保只使用一次连接,并从(已验证的)打开的套接字获取尽可能多的连接,可以避免这种情况
考虑将您的连接移动到循环之外。如果您绝对必须使用ssh,并且您使用的数据太大,并行性可能会有所帮助,但这将涉及更多的协调 添加代码会有帮助,为什么通过SSH而不是HTTP API接收值?(因为您正在加载HTML页面)使用FindBugs,它会给出关于string+之类的警告。分析是有意义的。我如何让程序一次吐出所有的值?每个“服务器”在每个循环中都是一个不同的值