Есть ли способ использовать MongoOpeations в приложении Springboot, которое настроено с двумя базами данных mon go - PullRequest
0 голосов
/ 14 марта 2020

Я сделал пример приложения со Springboot для соединения с двумя базами данных, используя следующую ссылку: https://dzone.com/articles/multiple-mongodb-connectors-with-spring-boot

Я могу получить доступ к данным из разных баз данных, используя интерфейсы репозитория, расширяющие MongoRepository. Но я хотите получить доступ к данным с помощью MongoOperations, как показано ниже, как различать две базы данных

@RestController
@RequestMapping(value = "/sample")
public class SampleController {

    private final PrimaryRepository primaryRepository;
    private final SecondaryRepositor secondaryRepository;


    @Autowired
    MongoOperations mongoOps;

    @Autowired
    public SampleController(PrimaryRepository primaryRepository, SecondaryRepositor secondaryRepository) {
        this.primaryRepository = primaryRepository;
        this.secondaryRepository = secondaryRepository;
    }

    @RequestMapping(method = RequestMethod.GET)
    public void sample() {
        log.info("************************************************************");
        log.info("Start printing mongo objects");
        log.info("************************************************************");
       primaryRepository.save(new PrimaryModel(null, "Primary database plain object"));

        secondaryRepository.save(new SecondaryModel(null, "Secondary database plain object"));

        List<PrimaryModel> primaries = primaryRepository.findAll();
        for (PrimaryModel primary : primaries) {
            log.info(primary.toString());
        }

        List<SecondaryModel> secondaries = secondaryRepository.findAll();
        **List<SecondaryModel> second =   mongoOps.findAll(SecondaryModel.class);**
        log.info("RES: {}",second);
        for (SecondaryModel secondary : secondaries) {
            log.info(secondary.toString());
        }

        log.info("************************************************************");
        log.info("Ended printing mongo objects");
        log.info("************************************************************");

    }
}```

Ответы [ 3 ]

0 голосов
/ 14 марта 2020

Вы можете создать два компонента MongoOperations. Вы можете заменить localhost на IP-адрес компьютера БД. если у вас есть сегментированный кластер, вы можете изменить нижеприведенную реализацию new MongoClient(new MongoClientURI("mongodb://host1:27017,host2:27017"));

@Configuration
class MongoConfiguration {

    @Bean
    public MongoClient mongo() {
        return new MongoClient("localhost", 27017); // server address, port
    }

    @Bean
    @Qualifier("firstDatabase")
    public MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(mongo(), "test1Db"); // test1Db is database name 
    }

    @Bean
    @Qualifier("secondDatabase")
    public MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(mongo(), "test2Db");
    }
}

Теперь в вашем контроллере вы можете ввести как MongoTemplate, так и подключиться к соответствующей базе данных.

@Autowired
@Qualifier("firstDatabase")
MongoOperations mongoOps1;

@Autowired
@Qualifier("secondDatabase")
MongoOperations mongoOps2;
0 голосов
/ 14 марта 2020

Можно ли попробовать приведенную ниже конфигурацию для использования нескольких баз данных с MongoOperation @Configuration @EnableMongoRepositories (basePackages = {"com.company.repo.dbOne"}, mongoTemplateRef = "mongoTemplateOne") publi c класс AbcRepoConfiguration {

@Bean(name="mongoPropertiesOne")
@ConfigurationProperties
public MongoProperties mongoProperties() {
    return new MongoProperties();
}

@Bean(name="mongoPropertiesOne")
public SimpleMongoDbFactory mongoDbFactory(MongoClient mongo, @Qualifier("mongoPropertiesOne") MongoProperties mongoProperties) throws Exception {
    String database = this.mongoProperties.getMongoClientDatabase();
    return new SimpleMongoDbFactory(mongo, database);
}

@Bean(name="mongoTemplateOne")
public MongoTemplate mongoTemplate(@Qualifier("mongoTemplateOne") MongoDbFactory mongoDbFactory, MongoConverter converter) throws UnknownHostException {
    return new MongoTemplate(mongoDbFactory, converter);
}

} @Configuration @EnableMongoRepositories (basePackages = {"com.company.repo.dbTwo"}, mongoTemplateRef = "mongoTemplateTwo") publi c класс AbcRepoConfiguration {

@Bean(name="mongoPropertiesTwo")
@ConfigurationProperties
public MongoProperties mongoProperties() {
    return new MongoProperties();
}

@Bean(name="mongoPropertiesTwo")
public SimpleMongoDbFactory mongoDbFactory(MongoClient mongo, @Qualifier("mongoPropertiesTwo") MongoProperties mongoProperties) throws Exception {
    String database = this.mongoProperties.getMongoClientDatabase();
    return new SimpleMongoDbFactory(mongo, database);
}

@Bean(name="mongoTemplateTwo")
public MongoTemplate mongoTemplate(@Qualifier("mongoTemplateTwo") MongoDbFactory mongoDbFactory, MongoConverter converter) throws UnknownHostException {
    return new MongoTemplate(mongoDbFactory, converter);
}

}

0 голосов
/ 14 марта 2020

Вам нужно использовать @Qualifier, чтобы получить нужный экземпляр MongoDB.

@Autowired
@Qualifier("primaryMongoTemplate")
MongoOperations primaryMongoOps;

@Autowired
@Qualifier("secondaryMongoTemplate")
MongoOperations secondaryMongoOps;

Примечание:

Вам не нужно public SampleController(PrimaryRepository primaryRepository, SecondaryRepositor secondaryRepository), используйте вместо этого :

@RestController
@RequestMapping(value = "/sample")
public class SampleController {

    @Autowired
    PrimaryRepository primaryRepository;

    @Autowired
    SecondaryRepositor secondaryRepository;

    @Autowired
    @Qualifier("primaryMongoTemplate")
    MongoOperations primaryMongoOps;

    @Autowired
    @Qualifier("secondaryMongoTemplate")
    MongoOperations secondaryMongoOps;

    @RequestMapping(method = RequestMethod.GET)
    public void sample() {
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...