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

标签 java mongodb spring-boot

我收到此信息消息:

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/

相关文章:

java - 运行集成测试时嵌入 MongoDB

node.js - 使用 Axios 将 React 请求发送到 mongodb

java - 以下日期格式化代码线程安全吗?

java - Spring Boot 中永远不会调用 AuthenticationEntryPoint

java - 如何从 Google Cloud Storage 下载文件并将其返回到 Spring Controller 中

java - 自定义 DialogFragment onDismiss 未调用/工作

java - 我如何从号码选择器中跳过一些号码?

java - 是否有测试内存数据库的通用框架

java - Ruby on Rails "url_for"是否有 Java 等效项?

asp.net-mvc - 产品目录搜索 - NoSQL/MongoDB 的良好用例?