Мультитенантность MongoDB (Java): как переключать базы данных MongoDB с разными учетными данными БД во время выполнения с помощью MongoClient?


Я столкнулся с проблемой, связанной с мультитенантностью MongoDB. У меня есть две разные базы данных mongoDB (db1 и db2). Они оба имеют разные полномочия.

учетные данные db1:
имя пользователя: admin
пароль: passwd

учетные данные db2:
имя пользователя: admin1
пароль: passwd1

Мне нужно переключиться с одной базы данных на другую во время выполнения. Я автоматически подключил mongoTemplate с учетными данными db1, но теперь не могу обновить шаблон с учетными данными db2. Это возможно? Если да, то как? Если нет, подскажите, есть ли другой способ переключения баз данных во время выполнения с другими учетными данными.

Обратите внимание, что я знаю о «SimpleMongoDbFactory». Можно расширить «SimpleMongoDbFactory» и переопределить метод «getDb» и передать требуемое dbName в super.getDb («dbName») для мультитенантности. Но это не работает с двумя базами данных с разными учетными данными.


person Sumit A    schedule 03.01.2017    source источник
comment
Почему бы не создать два отдельных шаблона монго, каждый из которых ссылается на собственный simplemongodbfactory?   -  person s7vr    schedule 03.01.2017
comment
Это будет работать для 2 или фиксированного количества баз данных. Но что, если количество баз данных не фиксировано?   -  person Sumit A    schedule 04.01.2017
comment
Привет, Сумит, у меня такое же требование, если вы решили, пожалуйста, помогите мне.   -  person Lakshman Miani    schedule 20.10.2017
comment
Привет, Лакшаман, это невозможно с помощью Java MongoClient. Вы должны знать количество баз данных перед инициализацией mongoTemplate, как вы можете видеть в stackoverflow.com/a/41446383/2163876. Одним из решений является проверка Java MongoClient и обновление кода в соответствии с нашими требованиями.   -  person Sumit A    schedule 01.11.2017


Ответы (2)


Что, если вы создадите MongoCredential для каждой БД и передадите их MongoClient, который вы передадите своему SimpleMongoDbFactory

    MongoCredential credential1 = MongoCredential.createCredential("admin", db1, "password");
MongoCredential credential2 = MongoCredential.createCredential("admin1", db2, "password1");
    MongoClient mongoClient = new MongoClient(new ServerAddress(), Arrays.asList(credential1, credential2));
person perbellinio    schedule 03.01.2017
comment
Как этот подход работает с пулами соединений MongoDB? Сколько соединений будет присутствовать одновременно? - person Sumit A; 04.01.2017
comment
Если я не ошибаюсь, пул соединений управляется внутри MongoClient. В любом случае вы можете передать в конструкцию MongoClient MongoClientOptions (например, вы можете настроить количество соединений на хост). - person perbellinio; 04.01.2017
comment
В любом случае, что действительно важно для пула соединений, так это то, что у вас есть только один экземпляр вашего MongoClient для вашего приложения. - person perbellinio; 04.01.2017
comment
Хорошо, спасибо! Это было действительно полезно. - person Sumit A; 05.01.2017
comment
Пожалуйста. Поскольку это было полезно, не могли бы вы проголосовать за ответ. - person perbellinio; 05.01.2017
comment
Да, это я уже пробовал. Но я только что присоединился к stackoverflow, и моя репутация ниже 15. Они не позволяют мне проголосовать за это. Извиняюсь! Я буду голосовать за это как можно скорее. - person Sumit A; 06.01.2017
comment
Согласно MongoClient Java API список учетных данных будет использоваться для аутентификации всех подключений. - person cjungel; 08.01.2017
comment
Обратите внимание, что несколько учетных данных для каждого клиента теперь устарели и будут удалены в будущей версии: jira.mongodb. org/browse/JAVA-2656 - person elhefe; 15.11.2018

Создайте независимые экземпляры MongoTemplate, каждый со своими учетными данными, и выберите соответствующий во время выполнения.

Каждое соединение устанавливается с использованием учетных данных, поэтому, если вы измените их в существующем соединении, вы, по сути, разрушите соединение и создадите новое и не воспользуетесь преимуществами объединения.

person cjungel    schedule 03.01.2017
comment
Ага! Для двух баз данных это будет работать, но для «n» баз данных существует ли правильный способ мультиарендности вместе с пулом соединений? - person Sumit A; 04.01.2017
comment
Вам нужно будет сохранить какую-то карту экземпляров MongoTemplate и выбрать соответствующий во время выполнения. Если n велико и ожидается, что только несколько экземпляров будут активны в любой момент времени, я бы обязательно установил для минимального соединения значение 0, чтобы избежать установления неиспользуемых соединений с сервером и потенциального исчерпания его ресурсов. - person cjungel; 08.01.2017