2016-08-22 24 views
9

Otrzymuję ten błąd w wywołaniu find (domyślny sterownik Java) po okresie bezczynności. Próbowałem dodać ręcznego pulsu (pisząc do kolekcji z ograniczeniem), ale to nie pomogło. Występuje problem tylko wtedy, gdy jestem podłączony do instancji komponującej (tj. Nie w kontekście lokalnym).MongoSocketReadException: Przedwcześnie osiągnięty koniec strumienia (po okresie braku aktywności)

wersja 3.2.8 jest MongoDB, najnowszy sterownik (3.3), używając Java 8.

Każdy pomysł?

+0

Dowiedziałem się, że flaga 'isSocketKeepAlive' domyślnie' MongoClientOptions' ma wartość 'false', zmieniłem ją na true i teraz czekam, czy znowu otrzymam błąd. – Rhangaun

+6

Niestety, z .socketKeepAlive (true), otrzymujemy również ten błąd, moja wersja dysku to 3.0.4 – Feng

+0

czy mógłbyś znaleźć przyczynę na końcu? Teraz widzę ten błąd – Narges

Odpowiedz

1

zgadzam się z odpowiedzią Rhangaun tu jest mój soluction w kodzie Java:

public static DB getMongoDB() { 

     MongoClientOptions.Builder builder = new MongoClientOptions.Builder(); 
     //build the connection options 
     builder.maxConnectionIdleTime(60000);//set the max wait time in (ms) 
     MongoClientOptions opts = builder.build(); 


     char[] password2 = "mypassword".toCharArray(); 

     MongoCredential credential2 = MongoCredential.createCredential("username", "databasename",password2); 


     //add your option to the connection 

     MongoClient mongoClient = new MongoClient(new ServerAddress("server ip",27017), Arrays.asList(credential2),opts); 
     //use your database 
     cachedDb = mongoClient.getDB("databasename"); 

    return cachedDb; 

} 

Oto mój związek badania: http://3t.io/blog/how-to-prevent-your-connection-from-dropping-with-hosted-mongodb-instances/

Nadzieję, że to pomaga.

+0

Używałem tego konstruktora do budowania połączenia, ale zawsze get exception: MongoClient mongoClient = new MongoClient (nowy ServerAddress ("203.11.83.230", 27017), Arrays.asList (credential2)) Zmieniłem na differnet jeden z MongoClientOptions wszystko działa dobrze dla mnie – Daqian

12

znalazłem go w jakiejś dokumentacji:

przypadku długich uruchomionych aplikacji, często jest to rozsądne, aby umożliwić „keepalive” z liczbą milisekund. Bez tego po pewnym czasie mogą zacząć się pojawiać błędy "połączenia zamknięte", co wydaje się być bez powodu.

Sprawdź, czy to pomaga. Po połączeniu się z mongoDB możesz przekazać do niego opcje gniazd. Jestem z tła węzła używamy następujących opcji, aby utrzymać go przy życiu.

server: { 
     socketOptions: { 
      keepAlive: 100, 
      connectTimeoutMS: 30000 
     } 
    } 

Mam nadzieję, że to pomoże!