MongoSocketReadException:过早达到流的末尾(在一段时间不活动后)
2022-09-01 13:04:39
在一段时间不活动后,我在调用(默认Java驱动程序)上收到此错误。我试图添加一个手动心跳(写入一个上限集合),但它没有帮助。我只在 compose 上连接到实例时(即不在本地上下文中)时才遇到问题。find
MongoDB版本是3.2.8,最新的驱动程序(3.3),使用Java 8。
任何想法?
在一段时间不活动后,我在调用(默认Java驱动程序)上收到此错误。我试图添加一个手动心跳(写入一个上限集合),但它没有帮助。我只在 compose 上连接到实例时(即不在本地上下文中)时才遇到问题。find
MongoDB版本是3.2.8,最新的驱动程序(3.3),使用Java 8。
任何想法?
我在一些文档中找到了它:
对于长时间运行的应用程序,通常谨慎的做法是启用“keepAlive”(保留)毫秒。没有它,一段时间后,您可能会开始看到“连接关闭”错误,这似乎是没有理由的。
检查这是否有帮助。当您连接到mongoDB时,您可以向其传递套接字选项。我来自节点背景,我们使用以下选项来保持其活动状态。
server: {
socketOptions: {
keepAlive: 100,
connectTimeoutMS: 30000
}
}
希望这有帮助!!
我通过设置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上