java - MongoDb与java : create new connection pool and destroy the previous one

标签 java mongodb connection-pooling connection-pool

我正在用java实现mongodb。每当我的应用程序启动时,就会创建 mongoDB 的新连接池。有什么方法可以销毁该连接池并创建一个新连接池,而无需重新启动我的应用程序。我知道如果 mongoURI 中的任何参数发生更改,连接池就会重新初始化,但我想知道是否有任何方法可以在不更改 URI 参数的情况下做到这一点。主要目标是销毁连接池并创建新的连接池连接池!该连接池是由 MongoClient bean 创建的。因此我想销毁并重新创建 MongoClient Bean。

<bean id="monURI" class="com.mongodb.MongoClientURI"> <constructor-arg name="uri" value="${MONGO_URI}"/> </bean>

<bean id="mongoC" class="com.mongodb.MongoClient"> <constructor-arg ref="monURI"/> </bean>

最佳答案

您是否可以分享一些代码,以便我们可以为您的具体情况提供更多帮助?

在我工作的地方,我们使用com.mongodb.MongoClient。如果您也在使用它,则可以在销毁连接管理器组件之前调用 mongoClient.close() (使用 Spring,因此我们调用 close()在组件的@PreDestroy方法中)

--------编辑--------

根据我们对此答案的评论,我将采用以下方法之一:

  1. 使用您自己的包含 MongoClient 实例的类来包装 MongoClient。该类将公开一个方法(我们称之为 ResetConnectionPool),在该方法中您将调用 mongoClient.close()mongoClient = new MongoClient()
    您可能必须 @Autowire MongoClientURI bean 才能在您创建的类中使用它。此类的一些内容:

;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.net.UnknownHostException;

@Component
public class MongoClientWrapper {
    @Autowired
    private MongoClientURI mongoClientURI;

    private MongoClient mongoClient;

    @PostConstruct
    public void init() {
        mongoClient = getNewMongoClientInstance();
    }

    @PreDestroy
    public void beforeTearDown() {
        mongoClient.close();
    }

    public void resetConnectionPool() {
        mongoClient.close();
        mongoClient = getNewMongoClientInstance();
    }

    private MongoClient getNewMongoClientInstance() {
        MongoClient client = null;
        try {
            client = new MongoClient(mongoClientURI.getURI());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } finally {
            return client;
        }
    }
}
  • 重新考虑 MongoClient bean 的范围。也许应该按请求或按 http session 而不是单例?有关 bean 作用域的更多信息,请查看这些链接:
  • 根据此 javadoc:https://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/MongoClientURI.html您可以向 URI 添加选项。您可以添加一个没有人使用但包含当前时间戳的选项。如果您想重置连接池,只需更改该时间戳,这会“更改”URI,从而重置您的连接池。类似的事情:
    mongodb://[用户名:密码@]主机1:端口1/dbName?_=1534228866003
  • -----结束编辑-----

    关于java - MongoDb与java : create new connection pool and destroy the previous one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51816287/

    相关文章:

    java - 使用 spring-data-jpa 中的 PagingAndSortingRepository 获取所有记录

    java - 如何得分然后将它们全部加起来

    regex - MongoDB对带括号的文本不区分大小写查询

    c# - 检测不可用的池化 SqlConnections

    java - 无需使用 Java 控制面板即可启用 java Applet 和 WebStart

    java - 查看库存而不进行编辑

    node.js - Nodejs Mongoose 获取属性值的结果数组

    mongodb - 使用scala和lift,如何对mongodb集合中的文档进行高效的过滤操作?

    php - 数据库连接池真的那么重要吗?

    hibernate - Spring Boot 出现 JDBCConnectionException "Unable to acquire JDBC Connection"