当前位置: 首页 > 知识库问答 >
问题:

在同一应用程序中为同一模型和同一存储库使用多个mongo DBs

商弘义
2023-03-14
@Repository
public class MyCustomRepository {

private Logger logger = LoggerFactory.getLogger(MyCustomRepository.class);

@Autowired
private MongoTemplateA mongoTemplateA;// Need to know if this is possible & how

@Autowired
private MongoTemplateB mongoTemplateB;// Need to know if this is possible & how

public List<MyModel> findByCriteria(MyRequest request) {
    List<MyModel> result;
    //Query query = <build query based on request>

    if (request.getUserType().equals("A")) {
        result = mongoTemplateA.find(query, MyModel.class);
    } else {
        result = mongoTemplateB.find(query, MyModel.class);
    }

    logger.debug("Result fetched with {} records", result.size());
    return result;
}   
}

共有1个答案

郎仰岳
2023-03-14

正如@Lucia正确指出的,下面是如何做到的:

  1. 有两个不同的配置占位符
@Configuration
@EnableMongoRepositories(basePackages = "com.snk.repository", mongoTemplateRef = "mongoTemplateA")
public class MongoConfigA {
    // Configuration class for DB 1 access
}

@Configuration
@EnableMongoRepositories(basePackages = "com.snk.repository", mongoTemplateRef = "mongoTemplateB")
public class MongoConfigB {
    // Configuration class for DB 2 access
}
@ConfigurationProperties(prefix = "mongodb")
public class MultipleMongoProperties {

    private MongoProperties adb = new MongoProperties();
    private MongoProperties bdb = new MongoProperties();

    public MongoProperties getAdb() {
        return adb;
    }

    public MongoProperties getBdb() {
        return bdb;
    }
}
@Configuration
@EnableConfigurationProperties(MultipleMongoProperties.class)
public class MultipleMongoConfig {

    @Autowired
    private MultipleMongoProperties mongoProperties = new MultipleMongoProperties();

    @Bean(name = "mongoTemplateA")
    @Primary
    public MongoTemplate mongoTemplateA() {
        return new MongoTemplate(aDbFactory(this.mongoProperties.getAdb()));
    }

    @Bean(name = "mongoTemplateB")
    public MongoTemplate mongoTemplateB() {
        return new MongoTemplate(bDbFactory(this.mongoProperties.getBdb()));
    }

    @Bean
    @Primary
    public MongoDbFactory aDbFactory(final MongoProperties mongo) {
        return new SimpleMongoDbFactory(new MongoClientURI(mongo.getUri()));
    }

    @Bean
    public MongoDbFactory bDbFactory(final MongoProperties mongo) {
        return new SimpleMongoDbFactory(new MongoClientURI(mongo.getUri()));
    }
}
    @Autowired
    @Qualifier("mongoTemplateA")
    private MongoTemplate mongoTemplateA;

    @Autowired
    @Qualifier("MongoTemplateB")
    private MongoTemplate MongoTemplateB;
mongodb.adb.uri=mongodb://user:pass@myhost1:27017/adb
mongodb.bdb.uri=mongodb://user:pass@myhost2:27017/bdb

如果您设置了mongo rplica,则可以将URL设置为:

mongodb.adb.uri=mongodb://user:pass@myhost1,myhost2,myhost13/adb?replicaSet=rsName
mongodb.bdb.uri=mongodb://user:pass@myhost1,myhost2,myhost13/bdb?replicaSet=rsName
    null
 类似资料:
  • 问题内容: 语境 我正在创建一个数据库环境,在该环境中,我想以几种不同的模式拆分数据以用于不同的用户组。但是,由于其中一个数据库包含公共实体,因此应该共享给所有人。 假设数据库: DB1-通用实体; 车轮实体 DB2-组“ A”; 汽车实体 DB3-组“ B”; 摩托车实体 我有三个不同的项目: 项目1: 车轮豆 专案2: 汽车制造商 专案3: 摩托车构造者 问题 我正在尝试从项目/方案(2,“

  • 问题内容: 语境 我正在创建一个数据库环境,在该环境中,我想以几种不同的模式拆分数据以用于不同的用户组。虽然,由于其中包含公共实体,所以应该将这些数据库之一共享给所有人。 假设数据库: DB1-通用实体; 车轮实体 DB2-组“ A”; 汽车实体 DB3-组“ B”; 摩托车实体 我有三个不同的项目: 项目1: 车轮豆 专案2: 汽车制造商 专案3: 摩托车构造者 问题 我正在尝试从项目/方案(2

  • 我可以重写,以便它将其数据存储在map中,但这意味着每个方法还需要传递另一个参数。变成,变成,看起来太难看了。操作还需要传递。 据我所知,另一种方法是创建一个存储库,它将管理的数据,并调用操作来重新初始化它。 这种方法的问题是,如果我们有两个(A和B),并且活动容器是A,因此包含在A中呈现的项,容器B仍然会监听的更改。如果检查是方法中的活动容器,我可以添加检查,但我不确定应该这样做。

  • 问题内容: 我已经使用spring-data使用spring boot分别配置了neo4j和cassandra存储库。但是,当我尝试在同一项目中使用两个存储库时,它无法按预期工作。 这是我的文件夹结构。 ----- org.test.project 请注意,所有存储库都通过相应的DAO扩展了相应的spring-datapository。 当我使用此配置运行时,会出现以下错误。 我尝试更改存储库名称

  • 这可能不是典型的设置,但由于更高的决策,我们最终在一个应用程序中有多个 kafka 集群,每个集群有多个主题,每个集群可能具有不同的序列化策略。Json/avro.avro可能与融合的架构注册表一起使用,或者使用单个对象编码。 好吧,我通过构建自己的抽象和注册中心,分析配置并手动创建大部分内容,以某种方式实现了它,但我觉得我需要在几个地方多次重复主题名称、模式注册url等内容,以便创建所有需要的b

  • 我有 和 两个不同的ApplicationPath和类如下所示。 如果我在param-value中取出一个包,这是有效的,如果我更改@Path注释之一,这也是有效的,所以这是我的配置的问题? 我用的是1.10号球衣。谢谢大家。