我在一家拥有多个品牌的公司工作,因此我们在一些不同的主机上拥有几个MongoDB 实例,为每个品牌的客户持有相同的文档模型。(相同的结构,不同的数据)
为简单起见,假设我们有一个Orange品牌,数据库实例服务于端口27017和Banana品牌,数据库实例服务于端口27018
目前我正在开发一种欺诈检测服务,该服务需要连接到所有数据库并一起分析所有客户的行为,无论品牌如何。
所以我的“模型”有一个Customer的共享实体,用@Document (org.springframework.data.mongodb.core.mapping.Document)注释
接下来我有两个 MongoRepositories,例如:
public interface BananaRepository extends MongoRepository<Customer, String>
List<Customer> findAllByEmail(String email);
public interface OrangeRepository extends MongoRepository<Customer, String>
List<Customer> findAllByEmail(String email);
使用一些存根方法通过 Id、Email 等查找客户。Spring 负责为此类接口生成所有实现类(非常标准的 spring 东西)
为了提示每个存储库连接到正确的 mongodb 实例,我需要两个 Mongo Config,例如:
@Configuration
@EnableMongoRepositories(basePackageClasses = {Customer.class})
public class BananaConfig extends AbstractMongoConfiguration {
@Value("${database.mongodb.banana.username:}")
private String username;
@Value("${database.mongodb.banana.database}")
private String database;
@Value("${database.mongodb.banana.password:}")
private String password;
@Value("${database.mongodb.banana.uri}")
private String mongoUri;
@Override
protected Collection<String> getMappingBasePackages() {
return Collections.singletonList("com.acme.model");
}
@Override
protected String getDatabaseName() {
return this.database;
}
我对Orange也有类似的配置,它指向正确的 mongo 实例。
请注意,我调用了两个存储库,然后将结果收集到一个列表中
我期望发生的是每个存储库都将连接到其相应的 mongo 实例并通过其电子邮件查询客户。但这并没有发生。我总是对同一个 mongo 实例执行查询。但是在数据库日志中,我可以看到 spring 建立了两个连接。它只使用一个连接来运行两个存储库的查询。
这并不奇怪,因为两个 Mongo Config 都指向同一个模型包。对。但我也尝试了其他方法,例如创建一个BananaCustomer 扩展 Customer到它自己的model.banana包中,另一个OrangeCustomer 扩展 Customer到它的model.orange包中,同时在每个config中指定正确的 basePackageClasses。但这两个都不起作用,我最终让这两个查询都针对同一个数据库运行。
:(
在搜索了几个小时的 Spring-data-mongodb 官方文档,并在这里和那里查看了数千行代码之后,我已经没有选择了:似乎没有人做过我之前想要完成的事情。 除了这里这个人必须做同样的事情,但使用 JPA 而不是 mongodb:链接到文章
好吧,虽然它仍然是弹簧数据,但它不是用于 mongodb。
所以这是我的问题:
¿ 如何明确告诉每个存储库使用特定的 mongo 配置?
神奇的自动装配规则,除非它不起作用并且没有人了解魔法。
提前致谢。
侃侃尔雅
相关分类