2017-01-03 16 views
5


我正面临一个关于MongoDB多租户的问题。我有两个不同的mongoDB数据库(db1和db2)。这些都有不同的凭据。MongoDB多租户(Java):如何在运行时使用MongoClient切换具有不同数据库凭据的MongoDB数据库?

DB1凭据
用户名:admin
密码:passwd文件

DB2凭据
用户名:ADMIN1
密码:passwd1

我需要从一个切换数据库到其他运行时。我使用db1凭证自动装配了mongoTemplate,但现在我无法使用db2凭证更新模板。这可能吗?如果是,如何?如果没有,请告诉我用任何其他方式在运行时使用不同凭据切换数据库。

请注意,我知道“SimpleMongoDbFactory”。可以扩展“SimpleMongoDbFactory”,并可以重写“getDb”方法,并在super.getDb(“dbName”)中传递所需的dbName以实现多租户。但是,这不适用于具有不同证书的两个数据库。

+0

为什么不创建两个单独的mongo模板,每个引用它自己的simplemongodbfactory? – Veeram

+0

这将适用于2个或固定数量的数据库。但是,如果数据库的数量不固定呢? –

+0

嗨Sumit,我有同样的要求,如果你已经解决了请引导我。 –

回答

4

如果您为每个DB一个MongoCredential并传递给你传递给你的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

这种方法如何与MongoDB连接池一起使用?一次会有多少个连接? –

+0

如果我没有错,连接池由MongoClient内部管理。无论如何,你可以传递给MongoClient构造一个MongoClientOptions(你可以例如配置每个主机的连接数)。 – perbellinio

+0

无论如何,对于连接池来说真正重要的是,您的应用程序只有一个MongoClient实例 – perbellinio

0

创建独立于MongoTemplate情况下,每一个与它自己的凭据,并选择在运行合适的一个MongoClient什么。

每个连接都使用凭证建立,所以如果您在现有连接上更改它们,实质上是破坏了连接并创建了一个新连接,并且不会利用连接池。

+0

是啊!对于两个数据库,它可以工作,但对于数量为n的数据库,是否有适合多租户和连接池的方式? –

+0

您需要保留一些MongoTemplate实例的映射并在运行时选择适当的映射。如果n很大,并且只有少数实例在任何给定的时间期望被激活,那么我将确保将最小连接设置为0以避免建立到服务器的未使用连接并可能耗尽其资源。 – cjungel

相关问题