如何使用凭据动态创建 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
对象时。
但是,由于我的应用程序在数据库级别是多租户的,所以这不起作用,因为它不允许在构建后添加额外的凭据(这意味着 MongoTemplate
s 无法动态创建)。它也不是理想的,因为如果列表中的任何凭据是错误的,none 数据库连接工作,而不是只有凭据错误的连接。
我也不想为每个数据库创建一个新的 MongoClient
实例。据我了解,这样做会为每个数据库创建一个新连接,而不是让 MongoClient
管理连接池,这最终是不可持续的,因为 Mongo 只允许有限数量的连接。
除了继续使用过时的库之外,我还有其他选择吗?
您可以做的是实例化 MongoClient
并使用 HashMap
将其缓存,并将一些唯一的数据库标识符作为键,将 mongoClient 作为值。使用创建 MongoTemplate
我最后做的是在 admin
数据库中创建一个用户,该用户可以访问我需要的所有数据库(通过 roles
数组实现)。我创建了一个 MongoClient
,以该用户身份对 admin
数据库进行授权。然后我可以毫无问题地动态创建 MongoTemplate
对象,因为我被授权的用户对这些数据库具有 readWrite
权限。
在 Spring Data MongoDB 1.9.0-RELEASE 之前,我能够创建一个 MongoTemplate 对象,如下所示:
new MongoTemplate(client, dbName, credentials)
。升级后,此构造函数不再有效,而是使用 MongoCredential
时出错。但是,没有类似的MongoTemplate
构造函数使用MongoCredential
。似乎现在指定凭据的唯一方法是在构造 MongoClient
对象时。
但是,由于我的应用程序在数据库级别是多租户的,所以这不起作用,因为它不允许在构建后添加额外的凭据(这意味着 MongoTemplate
s 无法动态创建)。它也不是理想的,因为如果列表中的任何凭据是错误的,none 数据库连接工作,而不是只有凭据错误的连接。
我也不想为每个数据库创建一个新的 MongoClient
实例。据我了解,这样做会为每个数据库创建一个新连接,而不是让 MongoClient
管理连接池,这最终是不可持续的,因为 Mongo 只允许有限数量的连接。
除了继续使用过时的库之外,我还有其他选择吗?
您可以做的是实例化 MongoClient
并使用 HashMap
将其缓存,并将一些唯一的数据库标识符作为键,将 mongoClient 作为值。使用创建 MongoTemplate
我最后做的是在 admin
数据库中创建一个用户,该用户可以访问我需要的所有数据库(通过 roles
数组实现)。我创建了一个 MongoClient
,以该用户身份对 admin
数据库进行授权。然后我可以毫无问题地动态创建 MongoTemplate
对象,因为我被授权的用户对这些数据库具有 readWrite
权限。