web-dev-qa-db-ja.com

Mongodb: `com.mongodb.MongoSocketReadException:途中でストリームの終わりに達しました`(モーフィア付き)

Mongodbに挿入する単純なデータ構造(以下で参照するTransaction)があります。

_{"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_です。

Interetingは、ローカルの開発環境(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

システムは他の書き込みで動作します(より大きなレコードでも)

9
Gelin Luo

根本的な原因はありませんが、最終的にはフィールドタイプをBigDecimalからdoubleに変更することで問題が解決しました。

この問題は、SIT環境と、mongodb cluserセットアップを持つ1つの開発者のWindows環境にあります。

2
Gelin Luo

ほとんどの場合、これは長い読み取り/書き込みによるタイムアウトの結果です。

タイムアウトを増やすか、完全に削除してください。

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

最も可能性の高い原因は、互換性バージョンの設定が低すぎることです。

Db.adminCommand({setFeatureCompatibilityVersion: "3.4"})を試してください

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

2
ogborstad