Spring Boot 多个MongoDB 数据源配置与实现

实现原理:

Spring Boot中通过依赖spring-boot-starter-data-mongodb,来实现spring-data-mongodb的自动配置,我们最终使用MongoDB操作数据库是通过 MongoTemplate类完成,他提供增删改查等方法

从上图可以看出MongoTemplate的连接配置可由MongoDbFactory 生成,从而提供了自定义连接的可能,

实际上,spring-data-mongodb的自动配置也是如此。

所以,可以创建多个一个MongoDbFactory 来构造不同的MongoTemplate,然后在操作数据库时根据使用场景注入不同的MongoTemplate来使用。

用数据库连接uri 创建 MongoClientURI ,再生成 SimpleMongoDbFactory,最后创建 MongoTemplate即可。

编码要点

首先定义多个数据库的配置,代码对应下边第〇点

然后读取数据库的配置,代码对应下边第一点

读取对应的配置信息并且装配指定的MongoTemplate,第三点

所有文件:
application.yml 
MultipleMongoProperties 
PrimaryMongoConfig
SecondaryMongoConfig
MultipleMongoConfig
PersonTest
MongoTestC 

完整文件以及代码

〇、application.yml 加上如下数据库配置

mongodb:
  primary:
    host: 192.168.1.2
    port: 27017
    database: primary
    #username: admin
    #password: admin

  secondary:
    host: 192.168.1.3
    port: 27017
    database: secondary
    #username: admin
    #password: admin

平时单个数据库配置格式为:spring:data:mongodb:... 是因为spring boot 默认的资源加载格式。这里mongodb开头是自定义。没有这个疑问的伙伴可以忽略这段话。。。

一、配置数据库的数据源:

通过@ConfigurationProperties(prefix = "mongodb")读取配置文件的mongodb节点配置

import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @ClassName: MultipleMongoProperties
 * @Description: 从配置文件加载数据源
 * @Author Tan
 * @Date 2019/7/3
 */
@Component
@ConfigurationProperties(prefix = "mongodb")
public class MultipleMongoProperties {

    private MongoProperties primary = new MongoProperties();
    
    private MongoProperties secondary = new MongoProperties();

    public MongoProperties getPrimary() {
        return primary;
    }

    public void setPrimary(MongoProperties primary) {
        this.primary = primary;
    }

    public MongoProperties getSecondary() {
        return secondary;
    }

    public void setSecondary(MongoProperties secondary) {
        this.secondary = secondary;
    }
}

二、两个数据库接口封装配置

import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

/**
 * @ClassName: PrimaryMongoConfig
 * @Description: TODO
 * @Author Tan
 * @Date 2019/7/3
 */
@Configuration
@EnableMongoRepositories(mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
public class PrimaryMongoConfig {
    public static final String MONGO_TEMPLATE = "primaryMongoTemplate";

}
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

/**
 * @ClassName: PrimaryMongoConfig
 * @Description: TODO
 * @Author TanXiongZhan
 * @Date 2019/7/3
 */
@Configuration
@EnableMongoRepositories(mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
public class SecondaryMongoConfig {
    public static final String MONGO_TEMPLATE = "secondaryMongoTemplate";

}

三、读取对应的配置信息并且装配对应的MongoTemplate(关键的一步)


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;

/**
 * @ClassName: MultipleMongoConfig
 * @Description: 读取对应的配置信息并且构造对应的MongoTemplate
 * @Author Tan
 * @Date 2019/7/3
 */
@Configuration
public class MultipleMongoConfig {

    @Autowired
    private MultipleMongoProperties mongoProperties;

    @Primary
    @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
    public MongoTemplate primaryMongoTemplate() throws Exception {
        return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
    }

    @Bean
    @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
    public MongoTemplate secondaryMongoTemplate() throws Exception {
        return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
    }

    @Bean
    @Primary
    public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
        if (StringUtils.isEmpty(mongo.getUsername()) || mongo.getPassword() == null ) {
            return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                    mongo.getDatabase());
        } else {
            String password = String.valueOf(mongo.getPassword());
            String url = "mongodb://" + mongo.getUsername()
                    + ":" + password
                    + "@" + mongo.getHost() + ":" + mongo.getPort() + "/" + mongo.getDatabase()
                    + "?authSource=admin&authMechanism=SCRAM-SHA-1";
            return new SimpleMongoDbFactory(new MongoClientURI(url));
        }
    }

    @Bean
    public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {
        if (StringUtils.isEmpty(mongo.getUsername()) || mongo.getPassword() == null ) {
                    return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                    mongo.getDatabase());
        } else {
            String password = String.valueOf(mongo.getPassword());
            String url = "mongodb://" + mongo.getUsername()
                    + ":" + password
                    + "@" + mongo.getHost() + ":" + mongo.getPort() + "/" + mongo.getDatabase()
                    + "?authSource=admin&authMechanism=SCRAM-SHA-1";
            return new SimpleMongoDbFactory(new MongoClientURI(url));
        }
    }

}

说明:@Primary 表明默认加载,假如使用的时候不表明具体的MongoTemplate,则使用@Primary所示的。如

@Autowired 
private MongoTemplate mongoTemplate;

 则得到的 mongoTemplate 对象就是 primaryMongoTemplate

四、使用

1、定义实体对象

public class PersonTest {

    private Integer id;
    private Integer age;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

2、测试与应用:

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


@RestController
@RequestMapping("mongoTest")
public class MongoTestC {

    @Resource(name = PrimaryMongoConfig.MONGO_TEMPLATE)
    private MongoTemplate primaryMongoTemplate;     //第一个库的MongoTemplate

    @Resource(name = SecondaryMongoConfig.MONGO_TEMPLATE)
    private MongoTemplate secondaryMongoTemplate;   //第二个库的MongoTemplate

    @Autowired 
    private MongoTemplate mongoTemplate;            //第一个库的MongoTemplate

    @GetMapping(value = "/test1")
    public void saveTest() throws Exception {
        PersonTest mgtest = new PersonTest();
        mgtest.setId(8);
        mgtest.setAge(88);
        mgtest.setName("8888");
        primaryMongoTemplate.save(mgtest);
        secondaryMongoTemplate.save(mgtest);
    }
}

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
要简单实现MongoDB数据源,可以使用Spring BootMongoDB数据源配置实现。首先,在项目的配置文件中添加多个MongoDB数据源配置,如下所示: ``` spring.data.mongodb.uri=第一个MongoDB数据源连接地址 spring.data.mongodb.other.uri=第二个MongoDB数据源连接地址 ``` 接下来,在代码中使用不同的MongoTemplate来操作不同的MongoDB库。可以通过在代码中注入不同的MongoTemplate对象来实现,如下所示: ```java @Autowired @Qualifier("mongoTemplate") private MongoTemplate mongoTemplate; @Autowired @Qualifier("otherMongoTemplate") private MongoTemplate otherMongoTemplate; ``` 以上代码中,`mongoTemplate`和`otherMongoTemplate`分别对应配置文件中的`mongoTemplate`和`otherMongoTemplate`,可以分别使用它们来操作不同的MongoDB库。 通过以上配置和代码实现,就可以简单实现MongoDB数据源。使用不同的MongoTemplate来操作不同的MongoDB库,实现数据源的分离和管理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringBoot mongodb数据源配置](https://blog.csdn.net/lgk601abc/article/details/129442741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cy谭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值