【问题标题】:Mongodb: `com.mongodb.MongoSocketReadException: Prematurely reached end of stream` with morphiaMongodb:`com.mongodb.MongoSocketReadException:过早到达流的结尾`与morphia
【发布时间】:2017-02-10 02:38:54
【问题描述】:

我有一个简单的数据结构(下面引用的Transaction)要插入到 mongodb:

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

我得到以下错误堆栈:

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

有什么想法吗?

更新代码以插入文档

transactionDao.save(...) 的实现可以在以下位置找到:

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

更新 2

系统可以与其他写入一起使用(即使记录更大)

【问题讨论】:

  • 用于插入该文档的代码在哪里?
  • 其他操作在您的 SIT 环境中真正起作用吗?
  • 是的,其他操作照常工作。这就是为什么它困扰我很多

标签: mongodb mongodb-java morphia


【解决方案1】:

大多数情况下,这是由于长时间读取\写入超时造成的。

尝试增加超时或完全删除它们:

    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);

【讨论】:

  • 这是为了保存一个非常小的对象而写的,我不想通过调整连接超时值来解决这个问题。如果你说的是直接原因,我需要理解为什么需要很长时间。
  • 请添加更多信息:还有其他写入工作吗?为什么使用事务?为什么你要用 New 设置两次相同的事务?
  • 已更新。 Transaction 只是一个数据模型,不是 SQL 事务。两个新交易的好地方。我应该解决这个问题。其实第一个new Transaction是用来打印调试信息的,原来是没有的。但不影响结果
  • 您在更新前运行查询?这可能会减慢更新速度。
  • 您是否尝试过对MODEL_TYPE.save 中的个人通话进行计时?甚至可以使用调试器来查看是否有任何调用需要很长时间才能意外完成?这可能会为我们指出一个更具体的问题。
【解决方案2】:

我没有找到根本原因,但最后我通过将字段类型从 BigDecimal 更改为 double 来解决问题。

在我们的 SIT 环境和一个开发人员的 Windows 环境中发现了该问题,该环境具有 mongodb 集群设置。

【讨论】:

  • 你找到根本原因了吗?
  • 不,不是。但是更改字段类型对我有用。我怀疑 mongodb 驱动程序或 Morphia 存在一些问题
  • 是的,这也解决了我的问题。就我而言,这是一个 Decimal128 类型的字段,需要更改。
【解决方案3】:

最可能的原因是兼容性版本设置得太低。

试试 db.adminCommand( { setFeatureCompatibilityVersion: "3.4" } )

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

【讨论】:

  • 我确认,当 CompatibilityVersion 低于 3.4 时,我与 BigDecimal 有同样的异常
猜你喜欢
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 2016-12-29
相关资源
最近更新 更多