springboot mongodb 配置多数据源

我想要的效果是,一个类统一管理多数据源,我传个参数进去,它就能返回我对应的mongotemplate

但是根据"mongbodb 多数据源"的关键词,找不到我想要的效果

网上大多都是明确知道自己是几个数据源,然后每个数据源具体配置,然后业务代码调用的时候,直接注入不同的数据源,这样的话,不太利于以后的数据库扩容

目录

网上找到的多数据源写法

自用易扩展的多数据源写法


比如如下的这种,我在网上找到的写法。

网上找到的多数据源写法

配的时候是这样的

spring:
  data:
    mongodb:
      primary:
        uri: mongodb://localhost:27017/primary
      secondary:
        uri: mongodb://localhost:27017/secondary

写配置class

@Configuration
public class PrimaryMongoConfig {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.data.mongodb.primary")
    public MongoClient primaryMongoClient() {
        return MongoClients.create();
    }

    @Primary
    @Bean(name = "primaryMongoTemplate")
    public MongoTemplate primaryMongoTemplate() {
        return new MongoTemplate(primaryMongoClient(), "primary");
    }
}

@Configuration
public class SecondaryMongoConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.data.mongodb.secondary")
    public MongoClient secondaryMongoClient() {
        return MongoClients.create();
    }

    @Bean(name = "secondaryMongoTemplate")
    public MongoTemplate secondaryMongoTemplate() {
        return new MongoTemplate(secondaryMongoClient(), "secondary");
    }
}

这样注入了2个Bean

@Service
public class ProductService {

    @Autowired
    @Qualifier("secondaryMongoTemplate")
    private MongoTemplate mongoTemplate;

    public void saveProduct(Product product) {
        mongoTemplate.save(product);
    }
}

通过标明名称的方式,来注入具体的数据源。

这种有个坏处,就是以后如果想扩展数据库,就必须来个类似于thirdMongoTemplate的玩意,然后需要写个switchCase的东西,返回具体的mongoTemplate

所以,我需要自己写个符合我需求的mongoTemplate的聚集类。

自用易扩展的多数据源写法

我的设计是,多数据源以配置文件里,数组的方式进行传入

如下

spring.data.mongodb.sources[0].url=mongodb://localhost:27017
spring.data.mongodb.sources[0].name=mongodb_0
spring.data.mongodb.sources[0].dbName=myTest
spring.data.mongodb.sources[1].url=mongodb://localhost:27017
spring.data.mongodb.sources[1].name=mongodb_1
spring.data.mongodb.sources[1].dbName=myTest_1

我现在暂时设置了2个数据源,url为真实链接,dbName为数据库名称,name为我之后要获取这玩意,设置的key名称。不用拘泥于这些名字,都是我自定义出来的。

对应这些配置,我定义了一个配置类去接。

@Data
@Component
@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoConfig {
  //sources跟配置文件的键名对应上,如果配置文件不叫这个,也跟着换下
  private List<MongoSource> sources;
}

因为配的是数组对象,也设置下该对象

@Data
public class MongoSource {
  private String name;
  private String url;
  private String dbName;
}

@Data 是lombada插件的

然后构造一下我想要的,管理多数据源的类

public class MongoFactory {
  // 这里的修饰符自己定吧,按你自己的需求
  private Map<String, MongoTemplate> dbMap = new HashMap<>();

  public MongoFactory() {}

  public void init(MongoConfig config) {
    // 初始化多数据源的map吧
    for (MongoSource item : config.getSources()) {
      MongoClient client = MongoClients.create(item.getUrl());
      dbMap.put(item.getName(), new MongoTemplate(client, item.getDbName()));
    }
  }

  public MongoTemplate getTemplate(String dbName) {
    return dbMap.get(dbName);
  }
}

这里有个很坑的地方,new MongoTemplate(client, item.getDbName()),这里的第2个参数,是指链接里要填的dataBase名称,别乱填了

将这个类进行注册

@Configuration
public class BeanFactoryConfig {
  //引入配置
  @Resource private MongoConfig config;

  //注册一下我自己造的factory
  @Bean
  public MongoFactory mongoFactory() {
    MongoFactory factory = new MongoFactory();
    factory.init(config);
    return factory;
  }
}

进行使用,直接进行注入

@Resource private MongoFactory factory;

比如说,判断该数据源是否存在某集合 

boolean flag =factory.getTemplate(name).collectionExists(collectionName);

factory.getTemplate(name) 根据name,可以从map拿到对应的数据源。

以上,我的需求就实现完毕。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot中,我们可以使用MongoDB作为数据库,并且可以配置多个MongoDB数据源。为了实现这个目标,我们需要在配置文件中添加多个MongoDB数据源的URI,然后在代码中根据不同的数据源配置生成不同的MongoTemplate。具体实现可以参考以下步骤: 1.在配置文件中添加多个MongoDB数据源的URI,例如: spring.data.mongodb.uri=mongodb://localhost:27017/primary spring.data.mongodb.other.uri=mongodb://localhost:27017/other 2.创建一个配置类MultipleMongoConfig,根据不同的数据源配置生成不同的MongoTemplate,例如: @Configuration public class MultipleMongoConfig { @Value("${spring.data.mongodb.uri}") private String primaryUri; @Value("${spring.data.mongodb.other.uri}") private String otherUri; @Primary @Bean(name = "primaryMongoTemplate") public MongoTemplate primaryMongoTemplate() throws Exception { SimpleMongoClientDbFactory simpleMongoClientDbFactory = new SimpleMongoClientDbFactory(primaryUri); return new MongoTemplate(simpleMongoClientDbFactory); } @Bean(name = "otherMongoTemplate") public MongoTemplate otherMongoTemplate() throws Exception { SimpleMongoClientDbFactory simpleMongoClientDbFactory = new SimpleMongoClientDbFactory(otherUri); return new MongoTemplate(simpleMongoClientDbFactory); } } 3.创建一个主数据源配置类PrimaryMongoConfig,配置主数据源的MongoTemplate,例如: @Configuration @ConfigurationProperties(prefix="spring.data.mongodb") public class PrimaryMongoConfig extends AbstractMongoConfig{ @Primary @Bean(name="mongoTemplate") @Override public MongoTemplate getMongoTemplate() { return new MongoTemplate(mongoDbFactory()); } } 以上就是使用Spring Boot配置多个MongoDB数据源的方法。如果你需要使用更多的数据源,只需要在配置文件中添加更多的URI,并在代码中生成对应的MongoTemplate即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

rgbhi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值