2017-02-10 16 views
8

Я простую структуру данных (Transaction ссылка ниже), который будет вставлен в MongoDB:MongoDB: `com.mongodb.MongoSocketReadException: Преждевременно достигли конца stream` с морфием

{"amount":111,"debitAcc":"588188286231743e7d5c923d","type":"CHARGE"} 

An Я получил следующий стек ошибок:

com.mongodb.MongoSocketReadException: Prematurely reached end of stream 
     at com.mongodb.connection.SocketStream.read(SocketStream.java:88) 
     at com.mongodb.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:494) 
     at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:224) 
     at com.mongodb.connection.UsageTrackingInternalConnection.receiveMessage(UsageTrackingInternalConnection.java:96) 
     at com.mongodb.connection.DefaultConnectionPool$PooledConnection.receiveMessage(DefaultConnectionPool.java:440) 
     at com.mongodb.connection.WriteCommandProtocol.receiveMessage(WriteCommandProtocol.java:262) 
     at com.mongodb.connection.WriteCommandProtocol.execute(WriteCommandProtocol.java:104) 
     at com.mongodb.connection.InsertCommandProtocol.execute(InsertCommandProtocol.java:67) 
     at com.mongodb.connection.InsertCommandProtocol.execute(InsertCommandProtocol.java:37) 
     at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:168) 
     at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:289) 
     at com.mongodb.connection.DefaultServerConnection.insertCommand(DefaultServerConnection.java:118) 
     at com.mongodb.operation.InsertOperation.executeCommandProtocol(InsertOperation.java:76) 
     at com.mongodb.operation.BaseWriteOperation$1.call(BaseWriteOperation.java:139) 
     at com.mongodb.operation.BaseWriteOperation$1.call(BaseWriteOperation.java:133) 
     at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:422) 
     at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:413) 
     at com.mongodb.operation.BaseWriteOperation.execute(BaseWriteOperation.java:133) 
     at com.mongodb.operation.BaseWriteOperation.execute(BaseWriteOperation.java:60) 
     at com.mongodb.Mongo.execute(Mongo.java:845) 
     at com.mongodb.Mongo$2.execute(Mongo.java:828) 
     at com.mongodb.DBCollection.executeWriteOperation(DBCollection.java:342) 
     at com.mongodb.DBCollection.insert(DBCollection.java:337) 
     at com.mongodb.DBCollection.insert(DBCollection.java:328) 
     at org.mongodb.morphia.DatastoreImpl.saveDocument(DatastoreImpl.java:1297) 
     at org.mongodb.morphia.DatastoreImpl.tryVersionedUpdate(DatastoreImpl.java:1340) 
     at org.mongodb.morphia.DatastoreImpl.save(DatastoreImpl.java:1286) 
     at org.mongodb.morphia.DatastoreImpl.save(DatastoreImpl.java:775) 
     at org.mongodb.morphia.DatastoreImpl.save(DatastoreImpl.java:758) 

Моя MongoDB версия 3.4.2.

Взаимодействие заключается в том, что у меня нет проблемы в локальной локальной среде (mint linux 18.1). Но он просто не может работать в моей среде SIT, которая является ubuntu 16.04

Любая идея?

Обновления с кодом, чтобы вставить документ

enter image description here

Где transactionDao.save(...) реализация может быть найдена по адресу:

https://github.com/actframework/act-morphia/blob/master/src/main/java/act/db/morphia/MorphiaDaoBase.java#L206

обновление 2

Система работает с другими сообщениями (даже с гораздо большими записями)

+0

Где код, который вы используете, чтобы вставить этот документ? – Dummy

+0

Выполняют ли какие-либо другие операции в вашей среде SIT? – ffeast

+0

Да другие операции работают как обычно. Вот почему мне очень надоедает –

ответ

1

Я не первопричина, но в конце концов я получаю вопрос фиксированный, изменив тип поля из BigDecimal в double.

Проблема найдена в нашей среде SIT environment и в среде одного разработчика, в которой установлена ​​установка cluser mongodb.

+0

Вы когда-нибудь находили причину? – ogborstad

+1

Нет, не совсем. Но изменение типа поля работает для меня. Я подозреваю, что есть некоторые проблемы в драйвере mongodb или Morphia. –

+0

Yup, это тоже отсортировало мою проблему. В моем случае это было поле с типом Decimal128, которое нужно было изменить. – LavenPillay

5

В большинстве случаев это результат тайм-аутов с длинными чтениями \ пишет.

пытается увеличить таймаут или удалить их полностью:

MongoClientOptions.Builder options_builder = new MongoClientOptions.Builder(); 
    options_builder.maxConnectionIdleTime(<some_long_time>); 
    MongoClientOptions options = options_builder.build(); 
    MongoClient mongo_db = new MongoClient ("your.db.address", options); 
+0

Это запись для сохранения очень маленького объекта, я не хочу обходить эту проблему, настраивая значение тайм-аута соединения. Мне нужно понять, почему это занимает много времени, если то, что вы сказали, является прямой причиной. –

+0

Пожалуйста, добавьте дополнительную информацию: работают ли какие-либо другие записи? Зачем использовать транзакцию? Почему вы устанавливаете одну и ту же транзакцию дважды с помощью New? –

+0

Обновлено. «Транзакция» - это просто модель данных, а не транзакция SQL. Хорошее место на двух новых транзакциях. Я должен это исправить. Фактически первая новая транзакция используется для распечатки отладочной информации, ее там не было. Но это не влияет на результат. –

2

Вероятнее всего, версия совместимости установлена ​​слишком низко.

Попробуйте db.adminCommand ({setFeatureCompatibilityVersion: "3,4"})

https://docs.mongodb.com/manual/reference/command/setFeatureCompatibilityVersion/

+0

Я подтверждаю, что у меня было такое же исключение с 'BigDecimal', когда CompatibilityVersion ниже 3.4 – zella

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

  • Нет связанных вопросов^_^