MongoDB:IllegalStateException:Spring Boot 应用程序中的池已关闭错误消息

yas*_*eco 4 java mongodb spring-boot

我收到此信息消息:

24 年 10 月 19 日 08:05:53:481 INFO Thread-4 omdconnection:71 - 已关闭与 mongodb:27017 的连接 [connectionId{localValue:35, serverValue:38}],因为池已关闭。

还有以下错误:

java.lang.IllegalStateException:池在 com.mongodb.internal.connection.ConcurrentPool.get(ConcurrentPool.java:137) 处关闭

java.lang.IllegalStateException:状态应该是:在 com.mongodb.assertions.Assertions.isTrue(Assertions.java:70) 打开

这就是我创建的方式MongoClient,简单明了:

@Bean
@Override
public MongoClient mongoClient() {
    return new MongoClient(host);
}
Run Code Online (Sandbox Code Playgroud)

这个SO 答案建议设置socketKeepAlive(true),但据我了解,此方法已被弃用,因为默认情况下它是正确的。

  • 我正在使用 MongoTemplate 和 MongoRepository。
  • 该应用程序(如上所述)是多线程的。

我想了解该错误的含义是什么?(即为什么游泳池会关闭?)。

我是否需要设置/调整一些 Spring-Boot 参数?我需要以不同的方式构建 MongoClient 吗?

Bur*_*dız 5

此错误意味着您的 MongoDB 连接由于某种原因被关闭,并且您正在尝试使用此连接池。

如果您使用 springs 连接池,您可以在没有 spring 的情况下创建连接池,并且可以在关闭时管理连接。(比如错误时重新连接)

如果您正在进行多线程操作,请更改您的MongoClientbeanScope并创建基于线程的。Mongoclient 在后台创建一个连接池,并将已经池化的连接提供给新创建的客户端,因此基于线程的客户端不会在每个自动装配操作上创建连接。

如果您想使用该socketKeepAlive功能,您需要提供如下选项:

MongoClientOptions options = MongoClientOptions.builder()
                .socketKeepAlive(false)
                .build();

MongoClient mongoClient = new MongoClient( "yourhost:mongoport" ,  options);
Run Code Online (Sandbox Code Playgroud)