Spring将MongoDB配置为在运行时使用动态数据库名称创建MongoClient

时间:2019-06-11 14:20:11

标签: java spring mongodb

我是spring的新手,我想用spring和mongodb实现以下功能:

我开发了一种架构,该架构具有通过休息连接的多个微服务。现在,我想使用mongodb设置我的datamanagementservice。必须将用户数据严格分开保存,因此我考虑使用用户ID(这是一个uuid字符串)作为数据库名称。我也不想使用JPA,因为我有不符合预定义模型的自定义和可变文档。 当我测试它们时,我发现了一些可行的解决方案,例如here的问题是,当我扩展AbstractMongoClientConfiguration时,我必须重写方法getDatabaseName(),并且在所有解决方案中都已看到,该名称是通过从应用程序属性。

问题:

在我的情况下,在客户端调用我的微服务所在的用户ID之前,数据库名是未知的,因此数据库名将传递给该服务。

问题: 是否可以使用userid作为数据库名称来为userdata创建一个“命名空间”? 是否可以使用某种工厂,在该工厂中我可以传递身份验证参数,数据库名称等来恢复Mongoclient / Mongotemplate?

1 个答案:

答案 0 :(得分:0)

首先,当您说“必须保存严格分开的用户数据”时,您是否考虑过在同一中用不同的 gson文档代表每个用户的可能性收集?也许这符合您的需求,尽管它们每个都有不同的属性,但它们之间可能有很多共同之处,它们都被视为同一系列的一部分。我想您已经知道了,但是以防万一,Mongo是基于文档的NoSQL技术,将用户组织在文档中而不是在不同的数据库中可能会帮助您实现不太复杂的数据结构,并可能使用不同的过滤器您可以设置为在集合中获取/插入/更新/删除文档。如果您还没有这样做,那么我将首先考虑这种可能性,即一个集合和一个数据库,而不是多个数据库,每个用户一个。 :)

这种方法还可以解决您遇到的getDatabaseName问题,因为它可以被所有人事先知道。您提到的“名称空间”可能完全是您的Mongo集合。通过只有一个数据库,您将不需要工厂来获得多个数据库连接,我认为在短期内(假设有多个请求的情况下)进行维护(在计算方面)不会那么容易和便宜。时间)作为单一连接,比在很小的时间范围内打开多个连接便宜得多。当您的服务收到userId时,您可以使用Mongo查询完美过滤集合中与该用户相对应的文档。

希望这个建议对您有帮助,我相信它可以大大减少您可能需要的解决方案的复杂性,否则,请您详细说明一下“将用户数据严格分开保存”是什么意思吗?如果在地理位置上,例如,您也可以使用Mongo群集。