【问题标题】:MongoDb with java : create new connection pool and destroy the previous oneMongoDb with java:创建新的连接池并销毁前一个
【发布时间】:2019-01-19 19:51:12
【问题描述】:

我正在用 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>

【问题讨论】:

  • 只是为了我的理解?这是生产/现场场景还是您正在当地尝试?
  • @SuganthanMadhavanPillai ,这是一个现场场景!

标签: java mongodb connection-pooling connection-pool


【解决方案1】:

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

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

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

按照我们的 cmets 回答这个问题,我会采用以下任何一种方法:

  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;
        }
    }
}
  1. 重新考虑 MongoClient bean 的范围。也许它应该是每个请求或每个 http 会话而不是单例?查看这些链接以获取有关 bean 范围的更多信息:
  2. 根据此 javadoc:https://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/MongoClientURI.html,您可以向 URI 添加选项。您可以添加一个没有人使用但包含当前时间戳的选项。如果要重置池,只需更改该时间戳,然后“更改”URI,从而重置您的连接池。类似的东西:
    mongodb://[username:password@]host1:port1/dbName?_=1534228866003

----- 结束编辑 -----

【讨论】:

  • 请分享代码作为问题的编辑,并尝试提供尽可能多的代码供我们尝试复制并尝试回答......
  • 感谢您的建议,我在问题中添加了一些代码并解释了这样做的原因!
  • 感谢您添加代码。您能否添加使用该 bean 的代码或解释它是如何使用的?是否每个请求都是单例,等等...
  • 在初始化过程中,创建了MongoClient的bean,同时也创建了默认值为'100'的连接池。现在我想销毁这个连接池并创建一个新的连接池,而无需重新启动 mongodb 或我的应用程序。 bean 是单例的。我正在使用简单的 com.mongodb.MogoClient 和 com.mongodb.MongoCleintURI
  • 我已经编辑了我的答案并添加了 3 种方法,我认为这可能会帮助您获得想要做的事情。我不确定我是否了解全部情况(例如,为什么您首先需要重置连接池?您在哪里使用您创建的 MongoClient bean 以及在哪个上下文或范围内?),但我希望其中之一我添加的选项可以解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多