2017-01-03 37 views
5

Mam do czynienia z problemem związanym z wielokrotnym dzierżawieniem MongoDB. Mam dwie różne bazy danych MongoDB (db1 i db2). Oba mają różne referencje.Wieloprocesowość MongoDB (Java): Jak przełączać bazy danych MongoDB z różnymi danymi uwierzytelniającymi bazy danych w czasie wykonywania, używając MongoClient?

DB1 poświadczenia:
Nazwa użytkownika: Administrator
hasło: passwd

DB2 poświadczenia:
Login: admin1
hasło: passwd1

muszę przełączyć się z jednego bazy danych do innych w czasie wykonywania. Mam autowired mongoTemplate z poświadczeniami db1, ale teraz nie mogę zaktualizować szablonu za pomocą poświadczeń db2. czy to możliwe? Jeśli tak, w jaki sposób? Jeśli nie, poinformuj mnie o innym sposobie przełączania baz danych w czasie wykonywania o różnych poświadczeniach.

Należy pamiętać, że jestem świadomy "SimpleMongoDbFactory". Można rozszerzyć "SimpleMongoDbFactory" i można zastąpić metodę "getDb" i przekazać wymagane dbName w super.getDb ("dbName") w celu uzyskania wielotorowości. Ale to nie działa z dwiema bazami danych o różnych poświadczeniach.

+0

Dlaczego nie utworzyć dwóch oddzielnych szablonów mongo, z których każdy odwołuje się do własnego simplemongodbfactory? – Veeram

+0

To działałoby dla 2 lub ustalonej liczby baz danych. Ale co jeśli liczba baz danych nie jest ustalona? –

+0

Witam Sumit, mam ten sam wymóg, jeśli rozwiązałeś proszę mnie. –

Odpowiedz

4

Co jeśli tworzysz MongoCredential dla każdego DB i przekazać je do MongoClient które przechodzą do 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)); 
+0

Jak to podejście działa z pulami połączeń MongoDB? Ile połączeń będzie obecnych jednocześnie? –

+0

Jeśli się nie mylę, łączenie połączeń jest zarządzane wewnętrznie przez MongoClient. W każdym razie możesz przejść do konstrukcji MongoClient MongoClientOptions (możesz na przykład skonfigurować liczbę połączeń na hosta). – perbellinio

+0

W każdym razie, co jest naprawdę ważne w przypadku łączenia połączeń, jest to, że masz tylko jedną instancję swojego MongoClient dla swojej aplikacji. – perbellinio

0

Tworzenie niezależnych przypadkach MongoTemplate każdy z jego własnych poświadczeń i wybrać odpowiedni w czasie wykonywania.

Każde połączenie jest ustanawiane za pomocą poświadczeń, więc jeśli zmienisz je w istniejącym połączeniu, zasadniczo niszczysz połączenie i tworzysz nowe i nie korzystasz z łączenia.

+0

Tak!Dla dwóch baz danych będzie działać, ale dla liczby baz danych "n", czy istnieje odpowiedni sposób na multi-tenancy wraz z pulą połączeń? –

+0

Musisz zachować mapę instancji MongoTemplate i wybrać odpowiednie środowisko uruchomieniowe. Jeśli n jest duże i oczekuje się, że tylko kilka instancji będzie aktywnych w danym momencie, powinienem ustawić minimalne połączenie na 0, aby uniknąć ustanawiania nieużywanych połączeń z serwerem i potencjalnie wyczerpania jego zasobów. – cjungel