Пользовательская реализация драйвера Java MongoDB

Мне нужно написать собственную реализацию com.mongodb.MongoClient, чтобы на лету добавлять учетные данные БД в MongoTemplate.

Это потому, что:
- мы работаем над многопользовательским приложением и базы данных создаются на лету.
- при автоматическом подключении MongoTemplate (при запуске сервера) список учетных данных, переданный MongoClient, будет изменяться.
- каждый раз, когда добавляется новый клиент, мы не могли повторно внедрить существующий MongoTemplate.
- также мы должны использовать общий пул соединений для всех клиентов, поэтому мы не можем использовать разные MongoTemplate для каждого клиента.

Могу ли я записать свою индивидуальную реализацию MongoClient? Если да, то как это следует реализовать, чтобы учетные данные БД менялись на лету?

Обратите внимание, что «credentialsList», переданный конструктору «com.mongodb.MongoClient», преобразуется в «unmodifiableList», поэтому его нельзя обновить.

Спасибо!!


person Sumit A    schedule 07.01.2017    source источник


Ответы (1)


Вы можете написать свой собственный MongoClient, расширив класс, но действительно ли это требуется? Не обязательно.

  1. MongoClientOptions предоставляет список свойств, которые вы можете настроить

  2. Используйте следующий конструктор MongoClient

    общедоступный MongoClient (список адресов сервера, список учетных данных, параметры MongoClientOptions) {super (семена, список учетных данных, параметры); }

передать список учетных данных, список адресов сервера и их параметры.

  1. Создайте SimpleMongoDBFactory с помощью MongoClient

  2. Наконец, используйте MongoDbFactory для создания MongoTemplate

Чтобы собрать все вместе:

    @Bean(destroyMethod="close")
    MongoClient mongoClient(MongoClientOptions mongoClientOptions){

        MongoClient mongoClient=new MongoClient(serverAddresses(),credentails(),mongoClientOptions);

        return mongoClient;
    }


    @Bean
    public  MongoClientOptions mongoClientOptions(){

        MongoClientOptions.Builder builder = MongoClientOptions.builder();
        MongoClientOptions options=builder.sslEnabled(true).build();        
        return options;
    }

    @Bean
    public MongoDbFactory mongoDbFactory(MongoClientOptions mongoClientOptions) throws Exception {
        return new SimpleMongoDbFactory(mongoClient(mongoClientOptions), "yourdb");
    }

    @Bean
    public MongoTemplate mongoTemplate(MongoClientOptions mongoClientOptions) throws Exception {

        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(mongoClientOptions));

        return mongoTemplate;

    }
person Barath    schedule 07.01.2017
comment
Да, спасибо! Но вы говорите, что каждый раз для каждого клиента создавать отдельный экземпляр MongoClient? Если да, поможет ли это для общего пула подключений? Если нет, как я могу обновить credentialList, переданный MongoClient, новыми учетными данными для новой базы данных, добавленной на лету? - person Sumit A; 09.01.2017
comment
это зависит от ваших требований, если вы создаете соединение на лету, вам нужно каждый раз создавать новый Mongoclient, передавая учетные данные, а затем выполнять операции. Но, как вы видите, учетные данные, используемые процессом mongo, являются константами, которые нельзя добавить на лету. поэтому лучше подготовить набор учетных данных до создания MongClient. Если ваше требование - создать mongoClient на лету с учетными данными diff, вы можете реализовать этот сценарий, используя шаблон проектирования, где вы можете поддерживать разные MongoClients с учетными данными в качестве ключа. - person Barath; 09.01.2017