2012-12-22 10 views
10

Chciałem zapytać, czy ktoś wie o jakichkolwiek problemach z Java 7 w FTP? Używałem obu bibliotek Sun Net i Apache Commons Net i obydwa działają zgodnie z oczekiwaniami w Javie 6. Ale kiedy przełączam swoje środowisko dev (Eclipse) na 1.7, te same operacje działają bardzo wolno (około 4.5 do 8KB/s), a są to serwery localhost i inny serwer w sieci LAN.Dlaczego pobieranie ftp jest powolne w java 7

Próbowałem buforowanych strumieni, transferu bajt po bajcie, wyłączając Algorytm Nagle i używając wygodnej metody Apache storeFile(), przy czym ta ostatnia w końcu osiąga prędkość na localhost, ale zwalnia ponownie do indeksowania na zdalnym serwerze. Ustawiam też wszystkie komputery, aby wyłączyć filtrowanie według protokołu 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(); 
      } 
     } 

Jak można zauważyć, jest to dość standardowy kod implementacyjny. Ponownie, w Javie 6, rzeczy naprawdę szybko się zepsuły. W Javie 7 zwalnia on od 10 do 20 razy w przypadku bibliotek Sun i Apache Commons. Używanie klienta FTP, takiego jak FileZilla, potwierdza, że ​​FTP działa normalnie, więc myślę, że to naprawdę ma coś wspólnego z Javą 7. Przekopałem się tak daleko, jak mogłem w Internecie, by wspomnieć o problemie, ale przede wszystkim rzeczy, które widziałem, były o konflikt firewall Java 7 i Windows 7.

Z góry dziękujemy za wszelkie uwagi.

+1

Pytanie: "Myślę, że to naprawdę ma coś wspólnego z Javą 7". Odp .: Naprawdę myślę, że prawdopodobnie masz rację. Spróbuj skompilować dla Java 6 i spróbuj uruchomić * ten sam * .class w obu JRE6 i JRE7. Założę się, że pewnie potwierdzisz swoją teorię :) – paulsm4

+0

Jaka jest klasa "danych"? – DWright

+0

Przepraszam, że tęskniłem za DWright. Próbowałem już arbitralnych typów danych od obiektów odwzorowanych hash do łańcuchów, tylko by sprawdzić, czy rzeczywiście było to przyczyną, ale wszystkie zostały przeniesione tak samo, to jest szybko w Javie 6 i powoli w Javie 7. –

Odpowiedz

10

Proszę sprawdzić, co aktualnie rozmiar bufora jest z:

ftpClient.getBufferSize(); 

Jeśli nie zostało jeszcze ustawione na coś innego, będzie to zero (0). Tak, ustaw go na wyższą wartość:

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

można sprawdzić swoją aktualną wartość jak poprzednio:

ftpClient.getBufferSize(); 

przy okazji, Zaakceptowanych odpowiedź, setBufferSize (0), nie Pracuj dla mnie. Używam najnowszej wersji Apache commons, więc prawdopodobnie to rozwiązanie działało z wcześniejszymi wersjami. Jeśli ustawisz rozmiar bufora na zero, nie będzie żadnych zmian w bieżącej wersji.

+0

zgadzam się z tobą. –

+0

To mi pomogło. Dzięki! – user2124871

+1

Dzięki. Używałem wtedy 3.2, i masz rację, problem został rozwiązany w 3.3. Zmiana zaakceptowanej odpowiedzi na twoją. –

13

Znalazłem poprawkę sortów, co najmniej wystarczającą do prawidłowego działania rzeczy w Javie 7. Zrobiłem to przy użyciu FTPClient setBufferSize (0); Niestety, nie sądzę, że istnieje podobna metoda w implementacji Sun Net w Javie 7. Nie to ma dla mnie znaczenia, ponieważ jestem całkiem zadowolony z Apache Commons Net. Mamy nadzieję, że Oracle dotrze do sedna tego w odpowiednim czasie.

+0

Dzięki, to rozwiązało problem dla mnie. Czy masz jakieś pojęcie, dlaczego tak się dzieje? –

+0

WOW! Miałem ten sam problem i dodanie ftpClient.setBufferSize (0) zmniejszyło czas ładowania jednego pliku z 117s do 6s! Tak nazywam dobry dzień w biurze! – Volksman

5

Nie jest to znany problem wydajności z Commons Net 3.2, która została ustalona na 3,3 snapshot, które można dostać się stąd:

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

Choć setBufferSize (0) wydaje się ważnym obejście to prawdopodobnie najlepiej, aby uzyskać odpowiednią poprawkę pomocą migawkę - jeśli jesteś ok z użyciem migawki;)

+0

setBufferSize (0) nie działało w moim przypadku. Zrobiło to 3,3-SNAPSHOT. Dzięki! –