【问题标题】:why is ftp upload slow in java 7为什么在 java 7 中 ftp 上传速度很慢
【发布时间】:2012-12-22 05:32:54
【问题描述】:

我想问是否有人知道有关 FTP 的任何 Java 7 问题?我使用了 Sun Net 和 Apache Commons Net 库,并且在 Java 6 上都按预期执行。但是当我将开发环境 (Eclipse) 切换到 1.7 时,相同的操作执行速度非常慢(大约 4.5 到 8KB/s),这些是本地主机服务器和局域网内的另一台服务器。

我尝试过缓冲流、字节到字节传输、关闭 Nagle 算法,并使用 Apache 便捷方法 storeFile(),后者最终在 localhost 上执行加速,但再次减速到爬行远程服务器。我还将所有机器都设置为关闭有状态的 FTP 过滤。

    InputStream is = null;
    OutputStream os = null;
    try {
        is = new BufferedInputStream(prepareInputStream(data));
        os = new BufferedOutputStream(prepareOutputStream(data));
        if (is == null || os == null) {
            log.error("Can't build connection");
            return;
        }

        byte[] buf = new byte[4096];
        int c = 1;

        while (c > 0) {
            c = is.read(buf);
            if (c > 0)
            os.write(buf, 0, c);
            data.incrCurrentPosition();
            fireStateChanged(data);
        }
        data.incrCurrentPosition();
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        setEnabled(false);  
    } catch (Exception e) {
        log.error(e.getMessage(), e);
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

可以看出,这是非常标准的实现代码。同样,在 Java 6 中,事情进展得非常快。在 Java 7 中,Sun 和 Apache Commons 库的速度都降低了 10 到 20 倍。使用像 FileZilla 这样的 FTP 客户端可以确认 FTP 运行正常,所以我认为它确实与 Java 7 有关。我尽我所能在网上搜索任何提到的问题,但大多数情况下,我看到的都是关于Java 7 和 Windows 7 防火墙冲突。

提前感谢您提供的任何见解。

【问题讨论】:

  • 问:“我认为这确实与 Java 7 有关”。 A:我真的认为你可能是对的。尝试为 Java 6 编译,并尝试在 JRE6 和 JRE7 上运行 same .class。我敢打赌你可能会证实你的理论:)
  • data 的类是什么?
  • 对不起,我错过了这个 DWright。我尝试了从哈希映射对象到字符串的任意数据类型,只是为了看看它是否确实是原因,但它们都传输相同,即在 Java 6 中快,在 Java 7 中慢。
  • 您是否尝试过使用 VisualVM 进行分析以查明实际方法?
  • 我正在设置它,但我也想跳到这里看看它是否是一个已知问题。

标签: java performance ftp


【解决方案1】:

我找到了某种修复方法,至少足以让 Java 7 中的东西正常运行。我通过使用 FTPClient 的 setBufferSize(0); 做到了这一点,不幸的是,我认为没有类似的Sun 的 Java 7 的 Sun Net 实现中的方法。这对我来说并不重要,因为我对 Apache Commons Net 非常满意。希望甲骨文能及时查明真相。

【讨论】:

  • 谢谢,这解决了我的问题。知道为什么会这样吗?
  • 哇!我遇到了同样的问题,添加 ftpClient.setBufferSize(0) 将一个文件的上传时间从 117 秒降低到 6 秒!这就是我所说的办公室美好的一天!
【解决方案2】:

请检查您当前的缓冲区大小:

ftpClient.getBufferSize();

如果您尚未将其设置为其他值,则该值将为零 (0)。 因此,将其设置为更高的值:

ftpClient.setBufferSize(1048576);//1024*1024

你可以像以前一样检查它的当前值:

ftpClient.getBufferSize();

顺便说一句,接受的答案 setBufferSize(0) 对我不起作用。我使用最新版本的 Apache commons,因此该解决方案可能适用于早期版本。如果将缓冲区大小设置为零,则当前版本不会发生任何变化。

【讨论】:

  • 这对我帮助很大。谢谢!
  • 谢谢。我当时使用的是 3.2,你是对的,这个问题在 3.3 中得到了修复。将接受的答案更改为您的答案。
  • 我在使用 camel-ftp 下载大文件时遇到了一些性能问题,这为我指明了正确的方向。谢谢
【解决方案3】:

Commons Net 3.2 存在一个已知性能问题,该问题已在 3.3 快照中得到修复,您可以从此处获取:

https://repository.apache.org/content/groups/snapshots/commons-net/commons-net/3.3-SNAPSHOT/

虽然 setBufferSize(0) 似乎是一种有效的解决方法,但最好使用快照来获得正确的修复 - 如果您可以使用快照;)

【讨论】:

  • setBufferSize(0) 在我的情况下不起作用。 3.3-SNAPSHOT 做到了。谢谢!
猜你喜欢
  • 2011-09-02
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2011-04-26
  • 2015-02-19
  • 2012-07-28
相关资源
最近更新 更多