如何使用凭据动态创建 MongoTemplate 实例?

How to dynamically create MongoTemplate instances, with credentials?

在 Spring Data MongoDB 1.9.0-RELEASE 之前,我能够创建一个 MongoTemplate 对象,如下所示: new MongoTemplate(client, dbName, credentials)。升级后,此构造函数不再有效,而是使用 MongoCredential 时出错。但是,没有类似的MongoTemplate构造函数使用MongoCredential。似乎现在指定凭据的唯一方法是在构造 MongoClient 对象时。

但是,由于我的应用程序在数据库级别是多租户的,所以这不起作用,因为它不允许在构建后添加额外的凭据(这意味着 MongoTemplates 无法动态创建)。它也不是理想的,因为如果列表中的任何凭据是错误的,none 数据库连接工作,而不是只有凭据错误的连接。

我也不想为每个数据库创建一个新的 MongoClient 实例。据我了解,这样做会为每个数据库创建一个新连接,而不是让 MongoClient 管理连接池,这最终是不可持续的,因为 Mongo 只允许有限数量的连接。

除了继续使用过时的库之外,我还有其他选择吗?

您可以做的是实例化 MongoClient 并使用 HashMap 将其缓存,并将一些唯一的数据库标识符作为键,将 mongoClient 作为值。使用创建 MongoTemplate

我最后做的是在 admin 数据库中创建一个用户,该用户可以访问我需要的所有数据库(通过 roles 数组实现)。我创建了一个 MongoClient,以该用户身份对 admin 数据库进行授权。然后我可以毫无问题地动态创建 MongoTemplate 对象,因为我被授权的用户对这些数据库具有 readWrite 权限。