J'ai une structure de données simple (la Transaction
référencée ci-dessous) à insérer dans mongodb:
{"amount":111,"debitAcc":"588188286231743e7d5c923d","type":"CHARGE"}
J'ai la pile d'erreur suivante:
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)
Ma version de mongodb est 3.4.2
.
Intereting est que je n'ai pas le problème sur mon environnement de développement local (mint linux 18.1). Mais cela ne peut tout simplement pas fonctionner sur mon environnement SIT, qui est un ubuntu 16.04
Une idée?
Mises à jour avec le code pour insérer le document
Où transactionDao.save(...)
implémentation peut être trouvé à:
mise à jour 2
Le système fonctionne avec d'autres écritures (même avec des disques beaucoup plus gros)
Je n'ai pas la cause principale, mais le problème est résolu en modifiant le type de champ de BigDecimal
à double
.
Le problème se trouve dans notre environnement SIT et l’environnement Windows d’un développeur doté d’une configuration mongodb cluser.
La plupart du temps, cela est dû à des délais d'attente avec de longues lectures\écrit.
essayez d'augmenter les délais d'attente ou de les supprimer complètement:
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);
La raison la plus probable est que la version de compatibilité est trop basse.
Essayez db.adminCommand ({setFeatureCompatibilityVersion: "3.4"})
https://docs.mongodb.com/manual/reference/command/setFeatureCompatibilityVersion/