MongoSocketReadException:过早达到流的末尾(在一段时间不活动后)

2022-09-01 13:04:39

在一段时间不活动后,我在调用(默认Java驱动程序)上收到此错误。我试图添加一个手动心跳(写入一个上限集合),但它没有帮助。我只在 compose 上连接到实例时(即不在本地上下文中)时才遇到问题。find

MongoDB版本是3.2.8,最新的驱动程序(3.3),使用Java 8。

任何想法?


答案 1

我在一些文档中找到了它:

对于长时间运行的应用程序,通常谨慎的做法是启用“keepAlive”(保留)毫秒。没有它,一段时间后,您可能会开始看到“连接关闭”错误,这似乎是没有理由的。

检查这是否有帮助。当您连接到mongoDB时,您可以向其传递套接字选项。我来自节点背景,我们使用以下选项来保持其活动状态。

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

希望这有帮助!!


答案 2

我通过设置sslEnabled到true来解决这个问题,代码示例:

@Bean
public MongoClient mongoClient() {
    List<ServerAddress> saList = new ArrayList<>();
    saList.add(new ServerAddress("cluster0-shard-00-00-75shm.gcp.mongodb.net", 27017));
    saList.add(new ServerAddress("cluster0-shard-00-01-75shm.gcp.mongodb.net", 27017));
    saList.add(new ServerAddress("cluster0-shard-00-02-75shm.gcp.mongodb.net", 27017));

    char[] pwd =  "password".toCharArray();
    MongoCredential credential = MongoCredential.createCredential("username", "admin", pwd);

    //set sslEnabled to true here
    MongoClientOptions options = MongoClientOptions.builder()
            .readPreference(ReadPreference.primaryPreferred())
            .retryWrites(true)
            .requiredReplicaSetName("Cluster0-shard-0")
            .maxConnectionIdleTime(6000)
            .sslEnabled(true)
            .build();

    MongoClient mongoClient = new MongoClient(saList, credential, options);     
    return mongoClient;
}

补充:我的客户端jar是org.mongodb.mongodb-driver 3.6.4,服务器是mongodb atlas M0 3.6.6在GCP上