我收到此信息消息:
19-October-24 08:05:53:481 INFO Thread-4 o.m.d.connection:71 - Closed connection [connectionId{localValue:35, serverValue:38}] to mongodb:27017 because the pool has been closed.
还有以下错误:
java.lang.IllegalStateException: The pool is closed at com.mongodb.internal.connection.ConcurrentPool.get(ConcurrentPool.java:137) at
java.lang.IllegalStateException: state should be: open at com.mongodb.assertions.Assertions.isTrue(Assertions.java:70)
这就是我创建 MongoClient
的方式,简单明了:
@Bean
@Override
public MongoClient mongoClient() {
return new MongoClient(host);
}
这个SO answer建议设置 socketKeepAlive(true)
但据我了解,此方法已被弃用,因为默认情况下它是 true。
- 我正在使用 MongoTemplate 和 MongoRepository。
- 应用程序(如上所述)是多线程的。
我想了解该错误的含义是什么? (即为什么池会被关闭?)。
我是否需要设置/调整一些 Spring-Boot 参数?我需要以不同的方式构建 MongoClient 吗?
最佳答案
此错误意味着您的 MongoDB 连接由于某种原因关闭,并且您正在尝试使用此连接池。
如果您使用 springs 连接池,您可以在没有 spring 的情况下创建连接池,并且可以在关闭时管理连接。 (如错误时重新连接)
如果您正在进行多线程操作,请更改您的 MongoClient
beans Scope
并创建它 thread based 。 Mongoclient 在后台创建一个连接池,并将已经池化的连接提供给新创建的客户端,因此基于线程的客户端不会在每个 Autowiring 操作上创建连接。
如果您想使用socketKeepAlive
功能,您需要提供如下选项:
MongoClientOptions options = MongoClientOptions.builder()
.socketKeepAlive(false)
.build();
MongoClient mongoClient = new MongoClient( "yourhost:mongoport" , options);
关于java - MongoDB:IllegalStateException:Spring Boot 应用程序中的池已关闭错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58540294/