我正在用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一起使用,因此我们在该组件的@PreDestroy方法中调用close()

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

在我们对此答案发表评论之后,我将采用以下两种方法之一:


用您自己的拥有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会话而不是单例?请查看这些链接,以获取有关bean作用域的更多信息:


https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
https://www.tutorialspoint.com/spring/spring_bean_scopes.htm
https://www.baeldung.com/spring-bean-scopes

根据此javadoc:https://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/MongoClientURI.html,您可以向URI添加选项。您可以添加一个没有人使用但包含当前时间戳的选项。如果要重置池,则仅更改该时间戳,然后“更改” URI,从而重置连接池。类似于:
mongodb:// [用户名:密码@] host1:port1 / dbName?_ = 1534228866003


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

关于java - MongoDb和Java:创建新的连接池并销毁前一个,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51816287/

10-11 03:32