MongoDb с Java: создать новый пул соединений и уничтожить предыдущий

Я реализую Mongodb в Java. Всякий раз, когда мое приложение запускается, создается новый пул соединений для mongoDB. Можно ли как-нибудь уничтожить этот пул соединений и создать новый, не перезапуская свое приложение. Я знаю, что если в mongoURI есть какой-либо аргумент, то пул соединений переинициализируется, но я хочу знать, если так или иначе есть, мы можем сделать это, не внося никаких изменений в аргументы URI. Основная цель - уничтожить пул соединений и создать новый пул подключений! Этот пул соединений создается компонентом MongoClient. Поэтому я хотел уничтожить и воссоздать Бин MongoClient.

<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>

1 ответ

Решение

Можно ли поделиться каким-то кодом, чтобы мы могли быть более полезны для вашей конкретной ситуации?

Где я работаю, мы используем com.mongodb.MongoClient, Если вы используете его, вы можете позвонить mongoClient.close() перед уничтожением компонента менеджера соединений (работая с Spring, поэтому мы называем close() в методе @PreDestroy компонента)

------- РЕДАКТИРОВАТЬ -------

После наших комментариев к этому ответу я бы выбрал один из следующих подходов:

  1. Оберните MongoClient собственным классом, который содержит экземпляр MongoClient. Этот класс будет предоставлять метод (давайте назовем его resetConnectionPool), и внутри этого метода вы будете вызывать mongoClient.close() а также mongoClient = new MongoClient(),
    Возможно, вам придется @Autowire bean-компонент MongoClientURI для использования внутри создаваемого вами класса. Что-то вроде этого класса:

;

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. Может быть, вместо синглтона это должно быть по запросу или по сеансу http? Взгляните на эти ссылки, чтобы узнать больше об областях применения бобов:
  2. Согласно этому javadoc: https://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/MongoClientURI.html вы можете добавить параметры в URI. Вы можете добавить параметр, который никто не использует, но содержит текущую метку времени. Если вы хотите сбросить пул, измените только эту временную метку, которая "изменяет" URI и, таким образом, сбрасывает ваш пул соединений. Что-то по линии:
    MongoDB://[имя пользователя: пароль @]host1:port1/ DbName _ = 1534228866003

----- КОНЕЦ РЕДАКТИРОВАНИЯ -----

Другие вопросы по тегам