2016-08-22 3 views
9

Я получаю эту ошибку на вызове find (драйвер Java по умолчанию) после периода бездействия. Я попытался добавить ручное сердцебиение (запись в ограниченную коллекцию), но это не помогло. Я получаю эту проблему только при подключении к экземпляру для компоновки (т. Е. Не в локальном контексте).MongoSocketReadException: преждевременно достигнутый конец потока (после периода бездействия)

MongoDB версия 3.2.8, последняя версия драйвера (3,3), с помощью Java 8.

Любая идея?

+0

Я обнаружил, что флаг 'isSocketKeepAlive'' MongoClientOptions' является 'false' по умолчанию, я изменил его на true, и теперь я жду, чтобы увидеть, снова ли я получаю ошибку. – Rhangaun

+6

к сожалению, с .socketKeepAlive (true), мы также получаем эту ошибку, моя версия диска 3.0.4 – Feng

+0

вы могли бы найти причину наконец? Теперь я сталкиваюсь с этой ошибкой – Narges

ответ

1

Я согласен с ответом Rhangaun здесь мой soluction в коде 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; 

} 

Вот мое исследование ссылка: http://3t.io/blog/how-to-prevent-your-connection-from-dropping-with-hosted-mongodb-instances/

Надеется, что это помогает.

+0

Я использовал этот конструктор для построения соединения, но всегда get exception: MongoClient mongoClient = новый MongoClient (новый серверный адрес («203.11.83.230», 27017), Arrays.asList (credential2)) Я изменил на differnet один с MongoClientOptions, все работает отлично для меня – Daqian

12

Я нашел его в какой-то документации:

Для длительных приложений, часто бывает целесообразно включить «Keepalive» с числом миллисекунд. Без этого через некоторый период времени вы можете начать видеть ошибки «соединения закрыты» для того, что кажется неразумным.

Проверьте, не помогает ли это. Когда вы подключаетесь к mongoDB, вы можете передать ему параметры сокета. Я из фона узла, мы используем следующие параметры, чтобы сохранить его.

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

Надеюсь, это поможет!

Смежные вопросы