【轉(zhuǎn)載】SpringBoot 2.3.2.RELEASE配置多個MongoDB 數(shù)據(jù)源 基于spring-data-mongodb-3.0.2 實現(xiàn)

如何在springboot中如何配置多個mongodb數(shù)據(jù)源,在新版本的spring-data-mongodb-3.0.2 中已經(jīng)不再支持網(wǎng)絡(luò)上的大部分的示例了,如:基于 SimpleMongoDbFactory 的這種方已經(jīng)被廢棄刪除了,應(yīng)改用SimpleMongoClientDatabaseFactory 方式,經(jīng)過一天的研究終于總結(jié)出了最新的配置方式供大家參考:

步驟如下:
導(dǎo)入依賴:

<!-- spring-boot 版本 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
    <relativePath/>
</parent>
 
<!-- spring-boot data mongodb 依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- spring-boot web 依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.在yaml 文件中 配置兩個以上mongo 集群數(shù)據(jù)源

spring:
  data:
    mongodb:
      mpc:
        uri: mongodb://用戶名:密碼@ip:port,ip:port/database
      saas:
        uri: mongodb://用戶名:密碼@ip:port,ip:port/database

2.排除springboot默認(rèn)的mongo初始化機(jī)制

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
public class MpcExampleApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(MpcExampleApplication.class, args);
    }
 
}

3.生成多個MongoTemplate 并開啟Repositor 操作并指定作用于哪個package
創(chuàng)建mongoSaasTemplate作用于"com.sun.mpc.example.storage.mongorpst.mpc" 下的Repository

/**
 * 初始化mcp mongoMpcTemplate
 * 如果不是多mongo數(shù)據(jù)源無需引入該配置
 * 注:開啟多數(shù)據(jù)源配置需要排除springboot默認(rèn)的mongo初始化機(jī)制
 * @SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
 * @author liangjian
 * @date
 */
@Slf4j
@Configuration
@EnableMongoRepositories(basePackages = "com.sun.mpc.example.storage.mongorpst.mpc", mongoTemplateRef = "mongoMpcTemplate")
public class MongoMpcTemplateConfig {
 
    @Value("${spring.data.mongodb.mpc.uri}")
    private String uri;
 
    @Primary
    @Bean(name = "mongoMpcTemplate")
    public MongoTemplate mongoMpcTemplate() throws Exception {
        log.info("-----------------------init mongoMpcTemplate success-----------------------------------");
        return new MongoTemplate(mongoMpcFactory());
    }
 
    @Bean
    @Primary
    public MongoDatabaseFactory mongoMpcFactory() throws Exception {
        SimpleMongoClientDatabaseFactory simpleMongoClientDbFactory = new SimpleMongoClientDatabaseFactory(uri);
        return simpleMongoClientDbFactory;
    }
 
}

創(chuàng)建mongoSaasTemplate作用于"com.sun.mpc.example.storage.mongorpst.saas" 下的Repository

/**
 * 初始化saas mongoSaasTemplate
 * 如果不是多mongo數(shù)據(jù)源無需引入該配置
 * 注:開啟多數(shù)據(jù)源配置需要排除springboot默認(rèn)的mongo初始化機(jī)制
 * @SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
 * @author liangjian
 * @date
 */
@Slf4j
@Configuration
@EnableMongoRepositories(basePackages = "com.sun.mpc.example.storage.mongorpst.saas", mongoTemplateRef = "mongoSaasTemplate")
public class MongoSaasTemplateConfig {
 
    @Value("${spring.data.mongodb.saas.uri}")
    private String uri;
 
    @Primary
    @Bean(name = "mongoSaasTemplate")
    public MongoTemplate mongoSaasTemplate() throws Exception {
        log.info("-----------------------init mongoSaasTemplate success-----------------------------------");
        return new MongoTemplate(mongoSaasFactory());
    }
 
    @Bean
    @Primary
    public MongoDatabaseFactory mongoSaasFactory() throws Exception {
        SimpleMongoClientDatabaseFactory simpleMongoClientDbFactory = new SimpleMongoClientDatabaseFactory(uri);
        return simpleMongoClientDbFactory;
    }
 
}

4.包結(jié)構(gòu)截圖


image.png
package com.example.dataview.uaa.repository;

import com.example.dataview.uaa.entity.MStudentTestEntity;
import org.springframework.data.mongodb.repository.MongoRepository;

/**
 * @author andy
 * @date 2022/11/9 17:53
 */
public interface MStudentTestEntityRepository extends MongoRepository<MStudentTestEntity, String> {
}

5.測試類

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource(properties={"spring.profiles.active=int"})
public class MongoRepositoryMultiSourceTest {
 
    @Autowired
    private MStudentTestEntityRepository mstudentTestEntityRepository;
 
    @Autowired
    private SStudentTestEntityRepository sstudentTestEntityRepository;
 
 
    @Test
    public void contextLoads() {
 
        mstudentTestEntityRepository.insert(MStudentTestEntity.builder()
                .name("woshi m")
                .age(20)
                .sex(true)
                .build());
        sstudentTestEntityRepository.insert(SStudentTestEntity.builder()
                .name("woshi s")
                .age(20)
                .sex(true)
                .build());
    }
 
}

最后雖然不是很詳細(xì),也沒有具體說明,但是我想凡是對這塊稍微有點了解跟研究的,一定能看懂,至此簡單集成已經(jīng)完成并且滿足基本需求。

6.擴(kuò)展 (選讀)設(shè)置 auto_index_creation = true 自動創(chuàng)建索引失效問題
由于我們覆蓋了 spring boot 自動裝配mongo配置,導(dǎo)致 實體類的字段注解 @Indexed 自動創(chuàng)建索引失效,即下面的yml 配置不起作用。

spring:
  data:
    mongodb:
      auto-index-creation: true #自動創(chuàng)建索引

為了解決這個問題我對配置類做了優(yōu)化如下:

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.domain.EntityScanner;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.annotation.Persistent;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
 
import java.util.Collections;
 
/**
 * 初始化saas mongoSaasTemplate
 * 如果不是多mongo數(shù)據(jù)源無需引入該配置
 * 注:開啟多數(shù)據(jù)源配置需要排除springboot默認(rèn)的mongo初始化機(jī)制
 * @SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
 * @author liangjian
 * @date
 */
@Slf4j
@Configuration
@EnableMongoRepositories(basePackages = "com.sun.mpc.example.storage.mongorpst.saas", mongoTemplateRef = "mongoSaasTemplate")
public class MongoSaasTemplateConfig {
 
    @Value("${spring.data.mongodb.saas.uri}")
    private String uri;
 
    @Bean
    public MongoTemplate mongoSaasTemplate(MongoDatabaseFactory mongoSaasFactory, MappingMongoConverter mongoSaasConverter) throws Exception {
        log.info("-----------------------init mongoSaasTemplate success-----------------------------------");
        return new MongoTemplate(mongoSaasFactory,mongoSaasConverter);
    }
 
    @Bean
    public MongoDatabaseFactory mongoSaasFactory()  throws Exception {
        SimpleMongoClientDatabaseFactory simpleMongoClientDbFactory = new SimpleMongoClientDatabaseFactory(uri);
        return simpleMongoClientDbFactory;
    }
 
    /**
     * 設(shè)置AutoIndexCreation 等于 true 自動創(chuàng)建索引
     * @param mongoSaasFactory
     * @return org.springframework.data.mongodb.core.convert.MappingMongoConverter
     * @author liangjian
     */
    @Bean
    MappingMongoConverter mongoSaasConverter(MongoDatabaseFactory mongoSaasFactory, ApplicationContext applicationContext) throws Exception {
        MongoCustomConversions conversions = new MongoCustomConversions(Collections.emptyList());
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoSaasFactory);
        PropertyMapper mapper = PropertyMapper.get().alwaysApplyingWhenNonNull();
        MongoMappingContext context = new MongoMappingContext();
        mapper.from(true).to(context::setAutoIndexCreation);
        context.setInitialEntitySet(new EntityScanner(applicationContext).scan(Document.class, Persistent.class));
        context.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
        mappingConverter.setCustomConversions(conversions);
        return mappingConverter;
    }
 
}

注意這段代碼:

 mapper.from(true).to(context::setAutoIndexCreation);  

我寫死為true 相當(dāng)于無需yml配置即可實現(xiàn)自動創(chuàng)建索引,讀者可根據(jù)實際情況,選擇從yaml 中讀取 auto-index-creation: true 配置,實現(xiàn)動態(tài)配置

完結(jié)~~~
————————————————
版權(quán)聲明:本文為CSDN博主「五系」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u013753310/article/details/117336385

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容