如何在java中更快地从远程服务器检索数据?

如何在java中更快地从远程服务器检索数据?,java,Java,我有一个增强的for循环,它进入ch.ethz.ssh2.connection以获得200多个值。每次它进入循环时,一个新服务器正在进行身份验证,它只从该服务器检索一个值。每次循环时,数据都被保存到arraylist中,以便使用thymeleaf在html表中显示。但是这个方法需要eclipse一次一个地运行所有200个值,然后当我打开localhost:8080加载所有包含所有数据的表时,它必须重新启动。加载页面需要5分钟以上。我能做些什么来加快速度 代码中的问题 List<DartMo

我有一个增强的for循环,它进入ch.ethz.ssh2.connection以获得200多个值。每次它进入循环时,一个新服务器正在进行身份验证,它只从该服务器检索一个值。每次循环时,数据都被保存到arraylist中,以便使用thymeleaf在html表中显示。但是这个方法需要eclipse一次一个地运行所有200个值,然后当我打开localhost:8080加载所有包含所有数据的表时,它必须重新启动。加载页面需要5分钟以上。我能做些什么来加快速度

代码中的问题

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+之类的警告。分析是有意义的。我如何让程序一次吐出所有的值?每个“服务器”在每个循环中都是一个不同的值